ProcessBuilder和ssh调用远程命令

时间:2017-07-30 18:09:46

标签: java ssh processbuilder

从一台Linux机器上,我想在远程Linux机器上运行命令,如下所示:

  

ssh remote_user @ remote_server remote_command< local_script

这里remote_command是在远程计算机上运行的命令,local_script是本地计算机上的一个文件,其中包含要传递给remote_command的字符串。如果我在本地计算机上的命令行运行它,那么我可以验证该命令在远程计算机上具有正确的效果。但是,我需要使用ProcessBuilder在Java应用程序中运行它,如下所示:

processBuilder = new ProcessBuilder("ssh remote_user@remote_server remote_command < local_script");
processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT);
process = processBuilder.start();

当我这样做时,我总是得到错误:

zsh:1:没有这样的文件或目录:local_script

我尝试了以下变体:

processBuilder = new ProcessBuilder("ssh", "remote_user@remote_server remote_command < local_script");
processBuilder = new ProcessBuilder("ssh", "remote_user@remote_server", "remote_command < local_script");
processBuilder = new ProcessBuilder("ssh", "remote_user@remote_server", "remote_command", "<", " local_script");

但似乎没有任何效果。我已经验证运行pwd给出了预期的目录,并且在使用ProcessBuilder运行时可以读取local_script(使用cat),所以我必须假设它与ssh命令的处理方式有关。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您有3个选择:

  • 将您的查询包装在&#34; sh&#34;打电话让&#34;&lt;&#34;由bash处理而不是由java处理(ProcessBuilder(&#34; sh&#34;,&#34; -c&#34;,&#34; ssh xxxxx yyyy&lt; zzz&#34;);(并且是文件的存储位置!)
  • 删除&#34;&lt; local_script&#34;并使用processBuider.redirectInput()。from(new File(local_script));将数据注入输入流
  • 使用第三方库来管理来自java的ssh(如JSch)