在远程服务器中SSH之后无法执行我的命令

时间:2011-07-12 02:31:59

标签: java shell process

我编写了一个在服务器上执行SSH并运行带参数的Java文件的代码。

我面临的问题是代码成功执行了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[] = {"root@web233.xyz.com","root@web234.xyz.com","root@web235.xyz.com","root@web153.xyz.com"};
        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但尚未调查过。

1 个答案:

答案 0 :(得分:1)

它不起作用的原因是此版本中的引号与它们在命令行上的效果不同。当您从bash调用SSH时,将远程命令放在引号中,以便将其全部解释为单个参数。 Bash会为您分离参数。使用exec,Java正在为您分割参数。 documentation for exec描述了它如何分离。它使用StringTokenizer,这是相当愚蠢的,并根据空格分隔线(忽略引号)。这意味着传递给命令的参数数组类似于:

{ "/usr/site/swapimages.sh", "root@something", "'/root/testRemote.sh",
  code, newCodeContents + "'" }

如果codenewCode中包含空格,则可能更多字符串。请注意,您的命令是数组中的多个元素,因此将被ssh视为多个参数。此外,ssh实际上将尝试执行名为'的目录中的命令。但是,你要传递的是:

{ "/usr/site/swapimages.sh", "root@something",
  "/root/testRemote.sh " + codeContents + " " + newCodeContents }

请注意,没有引号,整个命令是数组中的第三个元素。

所以,你只需要手动创建字符串数组并使用另一种形式的exec来获取字符串数组,这应该可以解决问题。