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