java - 无法使用 Runtime.Exec 传递远程命令 (ssh)

标签 java eclipse bash centos6

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

ssh -t <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9dcdaccdb98e998909b87989f91879b87989b9c" rel="noreferrer noopener nofollow">[email protected]</a> 'sudo reboot'

以上命令重新启动远程服务器而不检查任何密码;现在我通过 java 代码传递上述命令,如下所示(我用特殊字符将“sudo restart”括起来,以便它作为一个命令运行)

String cmd="ssh -t <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ef9a9c8a9ddeafded6ddc1ded9d7c1ddc1deddda" rel="noreferrer noopener nofollow">[email protected]</a> \'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 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c595f495e1d6c1d151e021d1a14021e021d1e19" rel="noreferrer noopener nofollow">[email protected]</a> 'sudo reboot'  
[2014-10-30 19:07:57,070] ERROR ERROR while executing command: ssh -t <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0c797f697e3d4c3d353e223d3a34223e223d3e39" rel="noreferrer noopener nofollow">[email protected]</a> '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) 按照链接 https://serverfault.com/questions/15667/remotely-reboot-tomcat 中的建议更新了 sudoers 文件

最佳答案

有时,我使用以字符串数组作为参数而不是单个字符串作为参数的 exec() 方法会更幸运。字符串数组允许人们更好地指定不同的参数是什么,根据我的经验,这更稳定,特别是如果参数中有空格,就像你一样。 因此请尝试以下操作:

String[] cmd = new String[]{"ssh", "-t", "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="cebbbdabbcff8efff7fce0fff8f6e0fce0fffcfb" rel="noreferrer noopener nofollow">[email protected]</a>", "sudo reboot"};
Runtime.getRuntime.exec(cmd);

关于java - 无法使用 Runtime.Exec 传递远程命令 (ssh),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26661100/

相关文章:

bash - 如何设置 bash 以在按一次 Tab 键时显示自动完成选项?

java - Java Concurrency in Practice 中的安全发布示例

java - 线程 "ContainerBackgroundProcessor[StandardEngine[Tomcat]]"java.lang.NoClassDefFoundError : ch/qos/logback/classic/spi/ThrowableProxy 中出现异常

java - Eclipse Java 虚拟机启动器 jvm.cfg 错误

java - Eclipse中的书签,设置和使用热键,它们存在吗?

linux - bash 脚本中的增量数(变量)

linux - OpenVPN密码认证

java - 使用旧身份验证 token 将用户迁移到新应用程序 - InstallReferrer 自定义参数

Java - 获取触发 mouseEvent 的按钮的名称

java - Scala项目作为eclipse中Java项目的 "sub-project"