如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 shell 脚本中使用 ssh?

shell中的tee命令的使用

shell脚本,tee小工具的用法。

如何使用SSH在远程计算机上运行shell脚本?

如何使用python执行远程shell脚本

shell脚本 grep cut tee diff