2011-07-12 37 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

相关问题