gpt4 book ai didi

java - 在远程服务器中通过 SSH 后无法执行我的命令

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:45 26 4
gpt4 key购买 nike

我编写了一段代码,可以在服务器中执行 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 + "'" }

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

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

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

因此,您只需手动创建字符串数组并使用另一种形式的 exec 来获取字符串数组即可解决问题。

关于java - 在远程服务器中通过 SSH 后无法执行我的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6658897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com