ProcessBuilder和ssh调用远程命令

use*_*582 1 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();
Run Code Online (Sandbox Code Playgroud)

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

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");
Run Code Online (Sandbox Code Playgroud)

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

war*_*gre 5

你有3个选择:

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