我有一种情况需要从文件中将几行(ip和hosts)附加到/ etc / hosts。
如果我执行以下命令
sshpass -p密码cat / tmp / hosts | sudo tee -a / etc / hosts
我正在
sudo:没有tty存在且没有指定askpass程序。 对不起,请再试一次。
sudo:没有tty存在且没有指定askpass程序。对不起,请再试一次。
sudo:没有tty存在且没有指定askpass程序。对不起,请再试一次。
sudo:3次密码尝试错误
任何替代方案?
答案 0 :(得分:3)
怎么样
sudo -S sh -c 'cat /tmp/hosts >> /etc/hosts' <<< "password"
最好在子shell中包含sudo的重定向,以便将提升的权限应用于打开目标文件。
答案 1 :(得分:0)
您遇到的错误来自sshpass
尝试将密码发送到cat
而不是sudo
的事实。理论上,你的命令行看起来应该是这样的:
cat /tmp/hosts |sshpass -p password sudo tee -a /etc/hosts
但sshpass
不会将stdin
转发给sudo
,所以这是一个死胡同。 (sudo
确实转发stdin
,但这就是sudo tee
之类的工作原因
你可以这样做
sshpass -p password sudo echo "Hello"
cat /tmp/hosts | sudo tee -a /etc/hosts
以便第二次拨打sudo
不需要密码。
另一个选项是将cat
和重定向嵌入到shell脚本中,然后只是
sshpass -p password sudo ./thescript.sh
或者你可以,正如@glennjackman写的那样,将cat
和重定向嵌入子shell中:
sshpass -p password sudo sh -c 'cat /tmp/hosts >> /etc/hosts'
当然,您可以将sudo
配置为not require passwords。