通过Java Runtime或ProcessBuilder在同一个Bash上运行多个命令

时间:2016-07-01 16:29:02

标签: java bash shell processbuilder runtime.exec

我想运行以下命令: -

# su - username
$ ssh-keygen -t rsa
  

输入3次将null传递给ssh-keygen选项,然后

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
$ chmod 0600 ~/.ssh/authorized_keys
$ tar xzf tarpath
$ mv untaredfile ~/somename

在shell终端上但是通过Java,我需要自动执行这些命令,其中将通过gui动态提供用户名和tarpath。 我尝试用java Runtime执行它,但每次调用时都无法获得预期的结果 Runtime.getRuntime().exec("somecommand");它创建了该命令的新实例,因此所有先前的命令都不存在。就像切换到用户一样。 任何人都可以建议我任何解决方案自定义shell脚本或通过ProcessBuilder。

1 个答案:

答案 0 :(得分:0)

要为enter传递3次ssh-keygen -t rsa,您可以尝试:

echo -e "\n\n\n" | ssh-keygen -t rsa

或使用以下命令来阻止密码短语提示并将密钥对文件路径设置为默认路径:

ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa 

要将多个命令转换为一个并将其与切换用户一起执行,您可以尝试使用su username -c或其他Shell语言:

su username -c 'ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa ; cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys'

要使用Java执行该过程,您可以尝试使用ProcessBuilder

String username = "user";
String command = "ssh-keygen -t rsa -N \"\" -f ~/.ssh/id_rsa ; cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys";
ProcessBuilder processBuilder = new ProcessBuilder("su", username, "-c", command);
Process process = processBuilder.start();