2017-07-30 25 views
1

,我想远程Linux机器上运行的命令如下:的ProcessBuilder和ssh从一个Linux机器上调用远程命令

ssh [email protected]_server remote_command < local_script

这里remote_command是在远程计算机上运行命令和local_script是本地计算机上包含要传递给remote_command的字符串的文件。如果我在本地机器的命令行上运行此命令,那么我可以验证该命令对远程机器有正确的影响。不过,我需要使用的ProcessBuilder Java应用程序中运行此如下:

processBuilder = new ProcessBuilder("ssh [email protected]_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", "[email protected]_server remote_command < local_script"); 
processBuilder = new ProcessBuilder("ssh", "[email protected]_server", "remote_command < local_script"); 
processBuilder = new ProcessBuilder("ssh", "[email protected]_server", "remote_command", "<", " local_script"); 

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

+0

AFAIK它是'。/ some_script'运行某些东西从“cwd” – 2017-07-30 18:17:07

回答

4

你有3种选择:

  • 使 “<” 是bash的处理不被Java(的ProcessBuilder( “SH”,包裹查询在 “sh” 的呼唤 “ - C”,” ssh xxxxx yyyy < zzz“);(并且是文件位置的ware)
  • 删除”< local_script“并使用processBuider.redirectInput()。(new File(local_script));将数据注入输入流
  • 使用第三方库来管理来自java的ssh(如JSch)
+0

第四选择 - 使用shell脚本(不会不同于上面的第一个选择) –

+0

谢谢 - 第一个选项工作。我喜欢第二种选择的想法,但还没有尝试过。 – user304582

相关问题