如何在shell脚本中使用带有sshpass的tee

时间:2013-12-05 15:53:36

标签: linux bash shell

我有一种情况需要从文件中将几行(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次密码尝试错误

任何替代方案?

2 个答案:

答案 0 :(得分:3)

怎么样

sudo -S sh -c 'cat /tmp/hosts >> /etc/hosts' <<< "password"

最好在子shell中包含sudo的重定向,以便将提升的权限应用于打开目标文件。

参考:见https://stackoverflow.com/a/4327123/7552

答案 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