我正在编写一个无人值守的 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 不需要检查指纹,您应该会看到它正在运行。