2014-10-20 79 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