如何在 shell 脚本中使用 tee 和 sshpass
Posted
技术标签:
【中文标题】如何在 shell 脚本中使用 tee 和 sshpass【英文标题】:How to use tee with sshpass in shell script 【发布时间】:2013-12-22 15:52:47 【问题描述】:我有一种情况需要将文件中的几行(ip 和主机)附加到 /etc/hosts。
如果我执行以下命令
sshpass -p 密码 cat /tmp/hosts |sudo tee -a /etc/hosts
我得到了
sudo:不存在 tty,也没有指定 askpass 程序。 抱歉,请重试。
sudo:不存在 tty,也没有指定 askpass 程序。抱歉,请重试。
sudo:不存在 tty,也没有指定 askpass 程序。抱歉,请重试。
sudo: 3 次错误密码尝试
有什么替代品吗?
【问题讨论】:
我不熟悉 sshpass:它可以与 sudo 一起使用吗?这听起来是特定于 ssh 的。 【参考方案1】:怎么样
sudo -S sh -c 'cat /tmp/hosts >> /etc/hosts' <<< "password"
最好将 sudo 重定向包含在子 shell 中,以便将提升的权限应用于打开目标文件。
参考:见https://***.com/a/4327123/7552
【讨论】:
【参考方案2】:您面临的错误来自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。
【讨论】:
以上是关于如何在 shell 脚本中使用 tee 和 sshpass的主要内容,如果未能解决你的问题,请参考以下文章