【问题标题】:Reading sudo password from a pipe从管道读取 sudo 密码
【发布时间】:2017-07-26 23:39:18
【问题描述】:

我尝试在脚本中使用 vi 命令,此外我尝试在同一脚本中传递 sudo 密码。所以我有类似的东西:

echo mypassword | bash -c "echo $'Goappendthis\E:x\n' | sudo vi /etc/test"

vi 命令成功,但它仍然不断询问密码。如何在没有密码的情况下执行此操作,以便可以在脚本中为多个主机运行相同的命令?

【问题讨论】:

  • 顺便说一句,以ex 调用它会将vi 置于为非交互使用而设计的模式下,或者使用vi -s scriptfile 将读取vi 命令以从scriptfile 运行。
  • 感谢您的 cmets。奇怪的是,公司明智的政策不允许我使用 sed、awk、python 或 perl 单线更改 root 拥有的文件。看起来它只允许使用 sudo vi 修改文件,并且考虑到我有数百个主机要修改,我需要找到一种方法来自动化它。所以基本上我需要运行 sudo vi 相同的文件在文件末尾添加一行然后保存。不然怎么办?
  • 即使您遵守了政策的信函,您也肯定没有遵守这里的精神。无论如何,典型的正确做法是使用任何编排系统(Puppet、Chef、SaltStack、CFEngine 等)提供的工具——贵公司用于模板化文件的生成。
  • ...你能把这件事往上踢几次,看看谁负责这项政策,以及他们认为哪些是经过批准的做法吗?

标签: bash shell ssh vi


【解决方案1】:

首先:不要这样做。使用不需要传递密码的权限提升机制。

第二:除非给定-S--stdin,否则sudo 直接从TTY 读取密码,而不是从标准输入。

第三:您需要将密码定向到sudo 的标准输入而不也覆盖vi 的标准输入。这样做可能如下所示:

echo mypassword | sudo --stdin -- bash -c "echo $'Goappendthis\E:x\n' | vi /etc/test"

【讨论】:

  • 我知道这不是理想的解决方案,但目前我可以用作解决方法。非常感谢。
【解决方案2】:

在许多情况下,您不想通过管道传输密码,而是要保持 sudo 凭据刷新

refreshPermissions () {
    local pid="${1}"

    while kill -0 "${pid}" 2> /dev/null; do
        sudo -v
        sleep 10
    done
}

refreshPermissions "$$" &

如果一个命令在你的程序中需要root权限,那么就这样做:

sudo [command]

并且不会要求密码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2023-03-06
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多