问题描述
我需要使用 sshpass
从 Java 代码通过 SSH 启动远程命令。
如果我手动输入控制台:
ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
完美运行,但要求输入密码。所以我尝试运行 sshpass
:
sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'
他们都没有工作。
最佳方案
这可能是由 ssh
完成的 host-key 检查引起的。看起来 sshpass
对无效的主机密钥保持沉默(在 stderr
和 stdout
上都没有输出)并且与 status-code 6
存在。在撰写本文时,这是修订版 50,代码中的匹配常量是 RETURN_HOST_KEY_UNKNOWN
,这暗示了该错误。
您的 error-code 可能会有所不同,查看上面链接的代码可能会给您一些见解。
如果您的问题是无效的 host-key,您应该三思而后行是否使用 CLI 选项覆盖错误。您的机器可能会受到威胁,或者您可能会受到 MITM 攻击!如果您 100% 确定不是这种情况,并且无法使已验证的 host-keys 保持最新,则可以使用如下命令:
sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
次佳方案
sshpass
命令仅在密码提示以 assword:
结尾时才有效。
如果您的密码提示不同,您可能需要调整 sshpass
的源代码以识别您的提示。
我在某些系统上看到过像 Password for user@host:
这样的密码提示,也许这是你的问题。
第三种方案
我想你想要这样的东西:
sshpass -p yourpassword ssh user@ipaddress somecommand
例如,这对我有用:
sshpass -p mypassword ssh username@10.0.0.9 touch foo