繁体   English   中英

无法使用Runtime.Exec传递远程提交(ssh)

[英]cannot pass remote commnds (ssh) using Runtime.Exec

我试图从我的java代码重启远程服务器。 我有无密码的ssh设置和sudoers文件有适当的参数,因此执行系统命令不需要密码。 我从我的本地计算机上的“bash shell”运行以下命令,并且我的远程系统关闭并且正常运行

ssh -t user1@192.168.2.125 'sudo reboot'

上面的命令重新启动远程服务器而不检查任何密码; 现在我通过java代码传递上面的命令如下(我用特殊字符包围'sudo reboot'以便它作为一个命令)

String cmd="ssh -t user1@192.168.2.125 \'sudo reboot\'";
log.info("Executing command.."+cmd);
p = Runtime.getRuntime().exec(cmd);
//open error stream and input stream and process

但是我收到以下错误

[2014-10-30 19:07:55,593] INFO Executing command..ssh -t user1@192.168.2.125 'sudo reboot'  
[2014-10-30 19:07:57,070] ERROR ERROR while executing command: ssh -t user1@192.168.2.125 'sudo reboot'  
[2014-10-30 19:07:57,070] ERROR Pseudo-terminal will not be allocated because stdin is not a terminal.
bash: sudo reboot: command not found

我究竟做错了什么? 我试图避免第三方库(例如:JSch)。 我正在使用centos6和Java 7

1)按照@hcs的建议取出单引号。 然后我得到另一个关于“.. tty ..”的错误消息

2)更新sudoers文件,如链接https://serverfault.com/questions/15667/remotely-reboot-tomcat中所建议

我有时会使用exec()方法获得更多运气,该方法将String数组作为参数,而不是单个String。 String-array允许更好地指定不同参数是什么,这在我的经验中更稳定,特别是如果你在参数中有空格。 请尝试以下方法:

String[] cmd = new String[]{"ssh", "-t", "user1@192.168.2.125", "sudo reboot"};
Runtime.getRuntime.exec(cmd);

'sudo reboot'周围删除单引号,即尝试运行中间有空格的命令,而不是以reboot作为参数运行sudo

令我感到困惑的是,当你直接从命令行运行它时,它最初工作的原因......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM