2014-10-20 81 views
1

我正在写一个Java程序,该程序应该ssh到IP并运行一个shell脚本代码。如何在java程序中运行长shell脚本代码?

问题是脚本太长,应该由java代码携带。

我用sshxcute库。

我有两个解决方案:

  1. 把所有的脚本一行一行地JAVA代码作为串并立即执行它们(该怎么做?),或者脚本代码中分离到80线。 (我不认为这是一种有效的方式!但我知道如何做到这一点的唯一方法)

  2. 把这个shell脚本代码放在JAVA文件中,然后执行它JAVA(我不知道该怎么做)。我应该把它放在哪里(主包?)以及谁来解决这个问题?

回答

1

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

,正如你所看到的,是我发出的命令的输出。

+0

这是在Linux机器上运行的代码吗?如果我想在另一台通过特定的Ip和密码连接到Linux机器的机器上运行这些bash脚本,怎么办? – 2014-11-04 22:23:08

+0

@HoKa它通过ssh连接到一台机器,然后发送一些命令。我在代码中给出的命令仅仅是一些例子。 Java不是特定于平台的,但是如果您通过ssh向机器发送命令,那么您发送的命令必须适合该机器,无论它运行的是什么。但是,这是ssh服务器的操作系统,它决定发送什么类型的命令,而不是运行Java应用程序的机器。 – 2014-11-04 22:27:54