做到這一點最簡單的方法是在遠程機器上啓動SSH會話,然後通過管道命令它:
// start ssh session to machine alan
Process p = new ProcessBuilder("ssh", "alan").start();
// get a means of reading its output
final Scanner reader = new Scanner(p.getInputStream());
// start a new thread going to read its output
Thread readThread = new Thread(new Runnable() {
public void run() {
while (reader.hasNextLine())
System.out.println(reader.nextLine());
reader.close();
}
});
readThread.start();
// get a means of sending it commands
PrintWriter writer = new PrintWriter(p.getOutputStream());
// send some commands
writer.println("touch /tmp/somefile");
writer.println("hostname");
writer.println("ls -l /home");
writer.println("uptime");
writer.println("exit");
writer.close();
// wait for reading thread to finish
readThread.join();
啓動過程後,並登錄到遠程機器。然後它開始一個新的線程去讀取進程的輸出(就你的程序而言,它是一個輸入流),並創建一個PrintWriter
,你可以用它來發送命令(這是進程的輸入,但是輸出流就您的程序而言)。
當我在我的筆記本上運行,我得到
alan
total 20
drwx------ 65 james james 4096 Oct 16 21:50 james
drwx------ 2 root root 16384 Apr 1 2014 lost+found
23:12:13 up 6 days, 8:46, 5 users, load average: 0.19, 0.19, 0.20
,正如你所看到的,是我發出的命令的輸出。
這是在Linux機器上運行的代碼嗎?如果我想在另一臺通過特定的Ip和密碼連接到Linux機器的機器上運行這些bash腳本,怎麼辦? – 2014-11-04 22:23:08
@HoKa它通過ssh連接到一臺機器,然後發送一些命令。我在代碼中給出的命令僅僅是一些例子。 Java不是特定於平臺的,但是如果您通過ssh向機器發送命令,那麼您發送的命令必須適合該機器,無論它運行的是什麼。但是,這是ssh服務器的操作系統,它決定發送什麼類型的命令,而不是運行Java應用程序的機器。 – 2014-11-04 22:27:54