我正在尝试以下命令:
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 身份验证是两组不同的凭据。-A
该ssh
命令的选项仅适用于 SSH。它提供了转发凭据的功能,以便您可以server
使用本地 SSH 密钥从 SSH 连接到另一个系统。
除非您有 sudo 规则允许您不带密码运行命令,否则它始终需要提示您输入密码,无论是从 shell 的终端还是使用 askpass 程序(如果已配置)。 askpass 程序是一个(通常是图形化的)辅助程序,它只是安全地提示您输入密码。要远程使用 sudo 进行身份验证,您必须执行它要求的两项操作之一:
确保您有 tty,以便 sudo 可以安全地在服务器上提示您输入密码。这就像使用 登录一样简单
ssh -t
。告诉 sudo 使用 askpass 程序提示您输入密码,并使用
-A
on 选项sudo
(不要与-A
for 选项混淆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