做到这一点最简单的方法是在远程机器上启动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