在远程脚本中使用 sudo 时,“sudo:抱歉,您必须有一个 tty 才能运行 sudo”

在远程脚本中使用 sudo 时,“sudo:抱歉,您必须有一个 tty 才能运行 sudo”

我想从嵌入式脚本在远程计算机上运行一系列 sudo 提升的命令。为了简化问题,我只是尝试运行 sudo id 并让它告诉我它是 root。

当我运行此脚本时,我遇到“sudo:抱歉,您必须有一个 tty 才能运行 sudo”:

#!/bin/bash
ssh -t 192.168.1.100<<EOF
sudo id
EOF

但当我运行这个时却没有:

#!/bin/bash
ssh -t 192.168.1.100 sudo id

如何获得第一个,其中嵌入脚本的文件结尾指定尊重 SSH 另一端的强制 tty?

答案1

第一个没有ttyforssh因为stdin没有连接到终端,它是一个此处文件。事实上,如果我尝试运行类似的命令(在 Debian 上),我会收到以下错误:

伪终端不会被分配,因为 stdin 不是终端。

为了让它工作,你可以这样做:

ssh -tt 192.168.1.100 <<EOF
sudo -S id
password
EOF

尽管这不是一个好主意,因为密码将是纯文本形式。

更新

我偶然发现了一个简单的解决方案,可以避免以纯文本形式对密码进行编码,您可以使用图形程序来输入密码:

ssh -X 192.168.1.100 <<EOF
SUDO_ASKPASS=/usr/lib/ssh/x11-ssh-askpass sudo -A id
EOF

当然,该ssh-askpass程序必须安装在给定位置,并且您必须在您正在使用的计算机上运行 X 会话。该程序有一些变体ssh-askpass也应该可以工作(Gnome/KDE 版本)。另外,像或之类的图形sudo替换程序也应该可以完成这项工作。gksukdesudo

相关内容