Answers:
sudo
支持这一点。
$ echo hello world | sudo cat
SUDO password:
hello world
所不同的是sudo
要求您输入用户密码,而不是root
(目标用户)密码。但是,如果您愿意,可以使用中的targetpw
(runaspw
或rootpw
)指令更改此行为sudoers.conf
。
但是,在阅读您要执行的操作时,虽然可以解决权限提升问题,但不会执行您期望的操作。含义/output/file
将不会以root用户身份创建,而是会以您的用户身份创建/修改。
原因是在调用任何命令之前已完成外壳输出重定向。因此,外壳程序将打开/output/file
,然后将打开的文件传递给su
/ sudo
(因此,是cat
)。
但是,您可以改用tee
此方法,因为该tee
实用程序将自行打开文件。
echo "hello world" | sudo tee /output/file >/dev/null
基本上tee
将输出复制到/output/file
和STDOUT中,但是将STDOUT重定向到中/dev/null
。
您也可以这样做:
echo "hello world" | sudo sh -c 'cat > /output/file'
...这不太神秘。
sudo -v
。如果您在几分钟内没有使用sudo,它将询问您的密码。
请注意,您不限于每个命令|pipe
:
this happens | then this | { then ; all of ; this too ; } | before this
所有这些进程都在同一时间被调用-但是它们都|pipe
在实际执行任何操作之前先等待它们-只要它们完全读取了|pipe
。因此,如果您需要评估可变的中间数据流或设置重定向,则可以。慢慢来。
echo "it takes time" |
{ exec 4>|file ; cat >&4 ; } |
( sleep 1 && cat <file )
it takes time
这是另一种方式:
echo "more of the same" |
( IFS= ; su -mc 'echo '"$(printf "'%s' " "`cat`")"' >|file' </dev/tty ) |
echo end of pipe
如果您不这样做,( subshell )
该命令$(cat)
也将得到</dev/tty
。
但是,如果您使用的是here-doc,则不需要两个cat
s:
rm ./file
su -c 'cat <&3 >|./file; echo "middle here"' 3<<HERE >&2 | {\
until [ -s ./file ] ; do sleep 1 ; done ;\
sed 's/beginning/end/' ./file ; }
$(echo "this is the beginning" | sed 'a\of the pipeline' | tee /dev/stderr)
HERE
输出:
this is the beginning
of the pipeline
Password:
middle here
this is the end
of the pipeline
以上大部分内容只是为了演示。您真正需要的是:
su -c 'cat <&3 >./file' 3<<HERE | { wait as needed ; more stuff to do ; }
$(echo "something" | and other things)
HERE