使用Java通过ssh运行bash命令

使用Java通过ssh运行bash命令,java,bash,command-line,ssh,Java,Bash,Command Line,Ssh,我想从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.e

我想从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
文件名是正确的
chmod
提供给runScript.bash的是
777

当我直接从bash运行命令行时,它可以工作。但从IDE来看,它不是


请告诉我如何正确运行此命令行?

错误说明:

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"
})

我建议使用本机Java SSH库(有几个),而不是尝试使用命令行工具。特别是,我在JSch方面有很好的经验:这里有一个使用JSch的简单示例:由于
SSH
的特殊语义,这恰好可以工作,它不关心Java是否会损坏您的参数。永远不要使用
Runtime.exec(字符串)
。改用
Runtime.exec(String[])
。@另一个家伙,我现在很懒,因为我没有指出这一点。适当修改。