ProcessBuilder 和 ssh 调用远程命令

ProcessBuilder and ssh to invoke remote command

从一台 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");

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

您有 3 个选择:

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