我可以在尝试之前检测 ssh 密钥身份验证是否会成功吗?

Mar*_*k W 2 ssh key-authentication

我有一个脚本需要在没有任何用户交互的情况下运行,并且需要设置一些 SSH 端口转发。它不应该提示输入密码 - 如果 SSH 需要密码才能继续,我希望我的脚本出错。

在尝试连接之前,有什么方法可以让 SSH 告诉我我的 SSH 代理是否正确设置为连接到特定主机?

Ran*_*832 5

ssh 有一个“BatchMode”选项,它只会让它失败而不是要求输入密码。这似乎比让您的脚本尝试预测它是否会要求输入密码容易得多。对 SuperUser 上类似问题回答指出,仅仅禁用 PasswordAuthentication 并不总是有效,因为有多种不同的交互式身份验证类型,而且它看起来也不会阻止它在密钥上提示输入密码。

您可以使用ssh -o BatchMode=yes,或将其放入主机的 ssh_config 中。


此外,如果没有控制终端,ssh 不会提示输入密码(它会出现错误“ read_passphrase: can't open /dev/tty: No such device or address”) - 您可以启动一个没有控制 tty 的进程,setsid理想情况下,您应该在启动 Jenkins 时执行此操作,而不是专门执行此操作对于 ssh 命令(这也将防止sudo提示输入密码等)

请注意,如果您运行一个进程,setsid它将自动在后台运行(因为 shell 无法使用不同会话中的进程进行作业控制),因此您需要通过将其 stdout/stderr 重定向到日志来为此做好准备文件(和标准输入到 /dev/null)。如果运行的程序setsid试图从标准输入读取任何内容,您可能会得到奇怪的结果,因为阻止后台进程读取终端的常用机制不起作用。