我编写了一段代码,可以在服务器中执行 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,但还没有研究过。
最佳答案
它不起作用的原因是此版本中的引号与命令行上的引号效果不同。当您从 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
来获取字符串数组即可解决问题。
关于java - 在远程服务器中通过 SSH 后无法执行我的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658897/