![如何测试SSH是否无密码访问而不提示输入密码?](https://linux22.com/image/11915/%E5%A6%82%E4%BD%95%E6%B5%8B%E8%AF%95SSH%E6%98%AF%E5%90%A6%E6%97%A0%E5%AF%86%E7%A0%81%E8%AE%BF%E9%97%AE%E8%80%8C%E4%B8%8D%E6%8F%90%E7%A4%BA%E8%BE%93%E5%85%A5%E5%AF%86%E7%A0%81%EF%BC%9F.png)
我正在编写一个无人值守的 shell 脚本来设置新服务器。由于我可能会多次运行它,因此我想检查是否已经设置了无密码 SSH 访问。像这样的命令
ssh newhost.example.com /bin/true
如果访问存在,则会成功退出,但如果不存在,则会挂起等待输入密码。
有没有办法关闭此类命令的密码访问可能性,以便在尚未设置无密码访问时它会很快失败?
答案1
您可以关闭该PasswordAuthentication
选项:
ssh -o PasswordAuthentication=no newhost.example.com /bin/true
255
当无密码访问被拒绝时,这不会提示输入密码并快速返回退出代码。
答案2
告诉ssh
您只想使用公钥身份验证,请使用PreferredAuthentications
配置选项。
互动式:
ssh -o PreferredAuthentications=publickey newhost.example.com /bin/true
或者在~/.ssh/config
文件中:
# or Host *.example.com, or Host *
Host newhost.example.com
PreferredAuthentications=publickey
答案3
您ssh -o PasswordAuthentication=no newhost.example.com /bin/true
仍然有可能遇到互动问题:
$ ssh -o PasswordAuthentication=no newhost.example.com /bin/true
The authenticity of host 'newhost.example.com (a.b.c.d)' can't be established.
ECDSA key fingerprint is SHA256:<fingerprint>.
Are you sure you want to continue connecting (yes/no)?
恕我直言,更好的选择是在 BatchMode 中运行 ssh:
$ ssh -o BatchMode=yes newhost.example.com /bin/true
Host key verification failed.
$ echo $?
255
如果您配置了 ssh 无密码登录并且正在运行,则 ssh 不需要检查指纹,您应该会看到它正在运行。