【问题标题】:run bash commande by ssh using Java使用 Java 通过 ssh 运行 bash 命令
【发布时间】:2014-04-07 21:03:09
【问题描述】:

我想从 java 运行一个带有 ssh 的脚本。该脚本将数字作为参数。我启动此代码:

String myKey="/home/my_key.pem";
Runtime runtime = Runtime.getRuntime();

String commande = "ssh -i "
+myKey+" ubuntu@ec2-56-75-88-183.eu-west-1.compute.amazonaws.com './runScript.bash 8000'";
Process p = runtime.exec(commande);      

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
String line = reader.readLine();
while (line != null) {

System.out.println(line);
line = reader.readLine();
}

p.waitFor();

我收到此错误:

bash: ./runScript.bash 8000: No such file or directory

文件名正确。给 runScript.bash 的 chmod777

当我直接从 bash 运行命令行时,它可以工作。但在 IDE 中却没有。

请问我该怎么做才能正确运行此命令行?

【问题讨论】:

  • 我建议使用本机 Java SSH 库——有几个——而不是尝试通过命令行工具。
  • 特别是我在 JSch 方面有很好的经验:jcraft.com/jsch
  • 这里有一个使用 JSch 的简单示例:*.com/a/24279641/3315914

标签: java bash command-line ssh


【解决方案1】:

错误说明了:

bash: ./runScript.bash 8000: No such file or directory

这表明 shell 正在尝试调用名为 ./runScript.bash 8000 的脚本——脚本文件名中包含空格和 8000。

我很少告诉任何人使用更少的引号,但是,这实际上是一个可以解决问题的情况。

最好完全避免双重评估:

Runtime.exec(new String[] {
   "ssh",
   "-i", myKey,
   "ubuntu@ec2-56-75-88-183.eu-west-1.compute.amazonaws.com",
   "./runScript 8000"
})

【讨论】:

  • 由于ssh 的特殊语义,这恰好起作用,它并不关心Java 会破坏您的参数。你永远不应该使用Runtime.exec(String)。请改用Runtime.exec(String[])
  • @thatotherguy,我现在因为没有指出这一点而感到懒惰。适当修改。
最近更新 更多