通过管道将密码传递给“sudo”,将其他数据传递给“sudo”命令

通过管道将密码传递给“sudo”,将其他数据传递给“sudo”命令

这两个命令都有效:(注意-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

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

echo -e '\nsome\nmore\ntext' | echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null

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

PS:不相关的小问题: 1> 与 > 相同吗?我相信他们是..

答案1

这会做:

{ echo 'mypassword'; echo 'some text'; } | sudo -k -S tee -a /etc/test.txt &>/dev/null

要点是sudo使用tee相同的标准输入,因此两者将从相同的源读取。我们应该将“mypassword”+“\n”放在我们想要传递给的任何内容之前tee

解释一下命令:

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

PS:关于 I/O 重定向:是的,你是1>filename对的,与>filename.他们都将标准输出重定向到文件名。而且0<filename<filename是相同的,都重定向标准输入。

答案2

这有点晚了,但我发现这个效果很好:

sudo -k && echo -e "password\ntext" | sudo -S tee file > /dev/null 2>&1

这不需要多个管道,并且更容易理解。

> /dev/null 2>&1

这会将所有输出(包括要求密码的输出)重定向到 /dev/null。

答案3

我无法将其放在评论中,但请注意,您可以将该-k选项与现有sudo命令结合使用,即,而不是使用

sudo -k && echo 'some text' | { echo 'mypassword'; cat -; } | sudo -S tee -a /etc/test.txt &>/dev/null

可以直接放到-k原来的sudo.它甚至可能“更安全”:

echo 'some text' | { echo 'mypassword'; cat -; } | sudo -k -S tee -a /etc/test.txt &>/dev/null

相关内容