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

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

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

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

答案1

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尝试从标准输入读取任何内容,您可能会得到奇怪的结果,因为阻止后台进程读取终端的常用机制不起作用。

答案2

如果不实际尝试,你无法知道它是否有效。有很多事情可能会出错。

就您而言,查看ssh_配置手册页中,我看到有一个“PasswordAuthentication”选项可以设置为“否”。看着SSH手册页中,我看到有一个“-o”选项,您可以使用它来将配置选项发送到程序。

因此,我认为你可以用它来关闭PasswordAuthentication并得到你想要的。

相关内容