将密码传送到 `sudo` 并将其他数据传送到 `sudo`ed 命令

Ant*_*ber 7 command-line bash sudo io-redirection tee

这两个命令都有效:(注意-Sinsudo告诉 sudo 从 stdin 读取密码)。

echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null
echo -e '\nsome\nmore\ntext' | sudo tee -a /etc/test.txt &> /dev/null
Run Code Online (Sandbox Code Playgroud)

现在我想将两者结合起来,即在一行中实现所有内容。但是,当然,这样的事情是行不通的:

echo -e '\nsome\nmore\ntext' | echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null
Run Code Online (Sandbox Code Playgroud)

什么会起作用?谢谢:) - 负载

PS:无关紧要的小问题: 1> 是否与 > 相同?我相信他们是..

Nav*_* Ht 8

这将:

{ echo 'mypassword'; echo 'some text'; } | sudo -k -S tee -a /etc/test.txt &>/dev/null
Run Code Online (Sandbox Code Playgroud)

问题的关键是sudo,并tee使用相同的标准输入,这样既会从相同的源读取。我们应该将“mypassword”+“\n”放在我们想要传递给的任何东西之前tee

命令解释:

  • 花括号组命令。我们可以将其{...}视为一个命令。无论是{...}写入管道。
  • echo 'mypassword'将“mypassword\n”写入管道。这是sudo稍后阅读。
  • echo 'some text'将“一些文本\n”写入管道。这就是tee最终会达到的。
  • sudo -k -S从它的标准输入(管道)读取密码,直到它到达“\n”。所以“mypassword\n”将在这里被消耗。该-k开关是为了确保sudo提示输入密码并忽略最近使用过的用户缓存凭据。
  • tee 从 stdin 读取,它得到里面剩下的任何东西,“一些文本\n”。

PS:关于 I/O 重定向:是的,你说得对,1>filename>filename. 它们都将 stdout 重定向到filename。并且0<filename<filename是相同的,都重定向标准输入。