【问题标题】:How to use tee with sshpass in shell script如何在 shell 脚本中使用 tee 和 sshpass
【发布时间】: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 的。

标签: linux bash shell


【解决方案1】:

怎么样

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

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

参考:见https://stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2021-12-09
      • 2022-07-29
      • 2020-03-16
      相关资源
      最近更新 更多