2011-07-12 99 views
0

我已經編寫了一個代碼,在服務器中執行SSH並運行帶有參數的Java文件。無法在遠程服務器的SSH中執行我的命令

我面對的問題是,代碼成功執行SSH,但之後不運行該命令。奇怪的是,如果我從服務器單獨運行命令它的作品。對此有任何建議嗎? 以下是代碼:

public void getSSH(String code, String newCode, JspWriter out){ 

    try{ 
     File f = new File("/usr/site/html/Output.txt"); 
     BufferedWriter output = new BufferedWriter(new FileWriter(f)); 
     String Servers[] = {"[email protected]","[email protected]","[email protected]","[email protected]"}; 
     for(int i =0;i<Servers.length && i<1 ;i++){ 

      Process p = Runtime.getRuntime().exec("/usr/site/swapimages.sh "+Servers[i]+" '/root/testRemote.sh "+ code+" "+ newCode+"'"); 
      out.println("/usr/site/swapimages.sh "+Servers[i]+" '/root/testRemote.sh "+ code+" "+ newCode+"'"+"<br>"); 
      Utils.waitFor(10000); 
     } 

    } 
} 

我也一直建議JSch但還沒有研究它。

+0

它會在ssh會話結束後運行命令嗎? – trutheality

+0

只有一個... exec(),所以我只希望它運行一個命令(... swapimages.sh)。你是否期望它也在同一個單獨的exec()中運行testRemote.sh?也許我錯過了一些東西,但不會需要第二個...... exec()for testRemote.sh? – Straff

+0

是啊,我在運行testRemote.sh在同一個exec命令 但它的工作時,我只是跑在服務器上.. – uppaljaskaran

回答

1

它不起作用的原因是此版本中的引號與命令行中的引號不具有相同的效果。當您從bash調用SSH時,您將遠程命令放在引號中,以便它們都被解釋爲單個參數。 Bash會爲你分開爭論。使用exec,Java正在爲您分解參數。 documentation for exec描述了它如何分離。它使用StringTokenizer,這是相當愚蠢的,並分離基於空格的行(忽略引號)。這意味着,傳遞到命令的參數數組是一樣的東西:

{ "/usr/site/swapimages.sh", "[email protected]", "'/root/testRemote.sh", 
    code, newCodeContents + "'" } 

這可能是更字符串,如果codenewCode在他們的空間。請注意,您的命令是數組中的多個元素,因此將被ssh視爲多個參數。另外,ssh實際上會嘗試執行名爲'的目錄中的命令。你想傳遞的,什麼雖然是:

{ "/usr/site/swapimages.sh", "[email protected]", 
    "/root/testRemote.sh " + codeContents + " " + newCodeContents } 

注意,沒有引號和所有的命令在數組中的第三個元素。

所以,你只需要手動創建字符串數組,並使用exec的另一種形式,它需要一個字符串數組,並應該解決問題。

+0

你也可以使用'ProcessBuilder',以幫助這一點。 – msandiford

+0

謝謝101100 ..是的,這是問題!我寫了我的命令的單個字符串,它工作! :) – uppaljaskaran

相關問題