![在远程脚本中使用 sudo 时,“sudo:抱歉,您必须有一个 tty 才能运行 sudo”](https://linux22.com/image/37944/%E5%9C%A8%E8%BF%9C%E7%A8%8B%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20sudo%20%E6%97%B6%EF%BC%8C%E2%80%9Csudo%EF%BC%9A%E6%8A%B1%E6%AD%89%EF%BC%8C%E6%82%A8%E5%BF%85%E9%A1%BB%E6%9C%89%E4%B8%80%E4%B8%AA%20tty%20%E6%89%8D%E8%83%BD%E8%BF%90%E8%A1%8C%20sudo%E2%80%9D.png)
我想从嵌入式脚本在远程计算机上运行一系列 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
第一个没有tty
forssh
因为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
替换程序也应该可以完成这项工作。gksu
kdesudo