我有一个脚本需要在没有任何用户交互的情况下运行,并且需要设置一些 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
尝试从标准输入读取任何内容,您可能会得到奇怪的结果,因为阻止后台进程读取终端的常用机制不起作用。