我想从嵌入式脚本在远程计算机上运行一系列 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