【问题标题】:Pass password to sudo for command that expects input将密码传递给 sudo 以获取需要输入的命令
【发布时间】:2018-06-01 10:24:09
【问题描述】:

我正在尝试创建一个 Shell 脚本并且(为了避免打字,而且暂时忽略安全相关问题)想直接将密码传递给“sudo”命令,例如,

pword="mypassword"
echo $pword | sudo -S whoami

这很好用。但是现在当命令本身需要输入时,这个方法似乎失败了,例如,

echo $pword | sudo -S cat<<<"Hello"

这会导致“密码错误”错误。目前,我的解决方案是首先运行一个“虚拟命令”,例如第一个示例,并使用这样一个事实,即对于第二个命令,系统不会再次提示输入密码。但是,有没有人知道更好的解决方案来让它工作?

【问题讨论】:

    标签: shell sudo


    【解决方案1】:

    您可以通过执行以下操作来推迟“此处文档”(&lt;&lt;&lt; 构造)的激活:

      echo $pw | sudo -S sh -c ' cat <<<"Hello" '
    

    更好的解决方案是使用sudo -A 而不是sudo -S,首先定义一个$SUDO_ASKPASS 环境变量来引用将发出密码的程序。这样您就不必担心与命令行的其余部分竞争 stdin。您应该创建这个 askpass 程序(它可以是一个 shell 脚本),使其只能由您自己读取、写入和执行,这样您的密码就会安全地隐藏在程序中。

    【讨论】:

    • 谢谢!省略撇号 ' ' 时对我有用,否则我会收到“语法错误:重定向意外”。我试过sudo -A,创建一个脚本文件来回显密码并设置export SUDO_ASKPASS=/../that_script_file.sh。效果很好!但是,我尝试通过 ssh 在远程机器上使用该命令,因此每台机器上都需要密码回显脚本文件。我试图在脚本function echo_pwd(){} 中定义一个函数,但无法将SUDO_ASKPASS 设置为该函数(这可能吗?)。
    猜你喜欢
    • 2020-02-20
    • 2023-03-25
    • 2011-11-08
    • 1970-01-01
    • 2017-04-07
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多