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

标签 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,但还没有研究过。

最佳答案

它不起作用的原因是此版本中的引号与命令行上的引号效果不同。当您从 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/

相关文章:

c - 在简单 Shell C 中重定向输入/输出

linux - QProcess 运行进程但 readAll 不返回任何内容

c++ - 多个工作进程调用 HttpReceiveHttpRequest

java - RX Java 中的分组并行调用

java - H2内存数据库和自定义@GenericGenerator策略

java - 找不到符号错误 javac 命令

linux - 在调用 shell 时设置环境变量的最佳方法

java - 无法编译JSP类

linux - windows环境下运行Linux Shell脚本

java - 将数据从 Java 进程传递到 python 脚本