![我可以在尝试之前检测 ssh 密钥身份验证是否会成功吗?](https://linux22.com/image/87878/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%B0%9D%E8%AF%95%E4%B9%8B%E5%89%8D%E6%A3%80%E6%B5%8B%20ssh%20%E5%AF%86%E9%92%A5%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E6%98%AF%E5%90%A6%E4%BC%9A%E6%88%90%E5%8A%9F%E5%90%97%EF%BC%9F.png)
我有一个脚本需要在没有任何用户交互的情况下运行,并且需要设置一些 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
尝试从标准输入读取任何内容,您可能会得到奇怪的结果,因为阻止后台进程读取终端的常用机制不起作用。