没有 tty 存在并且没有使用 `ssh -A` 指定的 askpass 程序

没有 tty 存在并且没有使用 `ssh -A` 指定的 askpass 程序

我正在尝试以下命令:

ssh -A user@server 'bash -s' < mylocalscript.sh

sudo: no tty present and no askpass program specified 但是当脚本到达时就会变得烦人sudo。根据man ssh-A应该转发本地身份验证,因此它应该能够sudo在远程服务器上使用。

我做错了什么/不明白什么..?

答案1

SSH 身份验证和 sudo 身份验证是两组不同的凭据。-Assh命令的选项仅适用于 SSH。它提供了转发凭据的功能,以便您可以server使用本地 SSH 密钥从 SSH 连接到另一个系统。

除非您有 sudo 规则允许您不带密码运行命令,否则它始终需要提示您输入密码,无论是从 shell 的终端还是使用 askpass 程序(如果已配置)。 askpass 程序是一个(通常是图形化的)辅助程序,它只是安全地提示您输入密码。要远程使用 sudo 进行身份验证,您必须执行它要求的两项操作之一:

  • 确保您有 tty,以便 sudo 可以安全地在服务器上提示您输入密码。这就像使用 登录一样简单ssh -t

  • 告诉 sudo 使用 askpass 程序提示您输入密码,并使用-Aon 选项sudo(不要与-Afor 选项混淆ssh!)。这可以在您的脚本中完成,例如,使用类似以下内容:

    export SUDO_ASKPASS=/usr/lib/openssh/gnome-ssh-askpass
    sudo -A ...
    

请注意,由于您将 shell 脚本通过管道传输到 SSH 连接的标准输入流,sudo因此无法安全地提示输入密码。如果需要通过 SSH 标准输入发送脚本(而不是仅将脚本复制到服务器),则第一个选项将不起作用。您必须使用 askpass 帮助程序或配置sudo使用所需的规则NOPASSWD(如果可以的话)。

答案2

不幸的是,您认为 -A 会帮助 sudo 的前提是错误的。它只是转发 ssh-agent。您必须按照警告提示运行 askpass。

另请注意,这bash -c不是必需的。您可以使用以下命令在脚本中简单地输入管道ssh server < mylocalscript.sh

相关内容