我编写了一个在服务器上执行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但尚未调查过。
答案 0 :(得分:1)
它不起作用的原因是此版本中的引号与它们在命令行上的效果不同。当您从bash调用SSH时,将远程命令放在引号中,以便将其全部解释为单个参数。 Bash会为您分离参数。使用exec
,Java正在为您分割参数。 documentation for exec
描述了它如何分离。它使用StringTokenizer
,这是相当愚蠢的,并根据空格分隔线(忽略引号)。这意味着传递给命令的参数数组类似于:
{ "/usr/site/swapimages.sh", "root@something", "'/root/testRemote.sh",
code, newCodeContents + "'" }
如果code
或newCode
中包含空格,则可能更多字符串。请注意,您的命令是数组中的多个元素,因此将被ssh视为多个参数。此外,ssh
实际上将尝试执行名为'
的目录中的命令。但是,你要传递的是:
{ "/usr/site/swapimages.sh", "root@something",
"/root/testRemote.sh " + codeContents + " " + newCodeContents }
请注意,没有引号,整个命令是数组中的第三个元素。
所以,你只需要手动创建字符串数组并使用另一种形式的exec
来获取字符串数组,这应该可以解决问题。