我需要使用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'
但它们都不起作用。
答案1
这可能是由 进行的主机密钥检查引起的ssh
。看起来 会对sshpass
无效的主机密钥保持沉默(无论是stderr
还是 都没有输出stdout
),并且状态码为6
。在撰写本文时,这是修订版 50,代码中的匹配常量是RETURN_HOST_KEY_UNKNOWN
,暗示了该错误。
您的错误代码可能有所不同,查看上面链接的代码可能会给您一些启发。
如果您的问题是无效的主机密钥,您应该仔细考虑是否使用 CLI 选项覆盖错误。您的机器可能已被入侵或者您可能遭受 MITM 攻击!如果您 100% 确定情况并非如此,并且您没有办法使已验证的主机密钥保持最新,则可以使用如下命令:
sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
答案2
sshpass
仅当密码提示以 结尾时,命令才有效assword:
。
如果您的密码提示不同,您可能必须调整源代码以sshpass
识别您的提示。
Password for user@host:
我在某些系统上看到过类似的密码提示 ,也许这是你的问题。
答案3
我想你想要这样的东西:
sshpass -p yourpassword ssh user@ipaddress somecommand
例如,这对我有用:
sshpass -p mypassword ssh [email protected] touch foo
答案4
sshpass 语法是
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
请注意,-p 和密码之间没有空格。
另外我注意到您必须至少手动连接 ssh 一次以获取您要连接的机器的 RSA 密钥,然后进入文件,~/.ssh/known_hosts
sshpass 才会允许您连接。
因此,在获取 known_hosts 文件中的条目后,我可以运行以下命令
sshpass -ffilename_with_password_in_it ssh user@server uname -a
它会在远程服务器上执行命令uname -a
,并将结果输出到本地机器的标准输出。