Mar*_*k W 2 ssh key-authentication
我有一个脚本需要在没有任何用户交互的情况下运行,并且需要设置一些 SSH 端口转发。它不应该提示输入密码 - 如果 SSH 需要密码才能继续,我希望我的脚本出错。
在尝试连接之前,有什么方法可以让 SSH 告诉我我的 SSH 代理是否正确设置为连接到特定主机?
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
试图从标准输入读取任何内容,您可能会得到奇怪的结果,因为阻止后台进程读取终端的常用机制不起作用。