如何测试SSH是否无密码访问而不提示输入密码?

如何测试SSH是否无密码访问而不提示输入密码?

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

相关内容