Respostas:
sudo
suporta isso.
$ echo hello world | sudo cat
SUDO password:
hello world
A diferença é que sudo
solicita sua senha de usuário, não a senha root
(usuário de destino). No entanto, se você desejar, poderá alterar esse comportamento com a diretiva targetpw
(ou runaspw
ou rootpw
) em sudoers.conf
.
No entanto, lendo o que você está tentando fazer, enquanto isso resolve o problema de escalação de permissão, ele não fará o que você espera. O significado /output/file
não será criado como o usuário root, será criado / modificado como seu usuário.
A razão para isso é que o redirecionamento de saída do shell é feito antes de chamar qualquer comando. Portanto, o shell é aberto /output/file
e passa o arquivo aberto para su
/ sudo
(e consequentemente cat
).
No entanto, você pode tee
fazer isso, pois o tee
utilitário abrirá o próprio arquivo.
echo "hello world" | sudo tee /output/file >/dev/null
Basicamente, tee
copia a saída para /output/file
e STDOUT, no entanto, STDOUT é redirecionado para /dev/null
.
Você também pode fazer:
echo "hello world" | sudo sh -c 'cat > /output/file'
... o que é menos enigmático.
sudo -v
. Ele solicitará sua senha se você não tiver usado o sudo em alguns minutos.
Só para você saber - você não está limitado a um único comando por |pipe
:
this happens | then this | { then ; all of ; this too ; } | before this
Todos esses processos são invocados ao mesmo tempo - mas todos esperam |pipe
antes de realmente fazer qualquer coisa - desde que eles leiam o |pipe
que é. Portanto, se você precisar avaliar uma variável no meio do caminho ou configurar um redirecionamento, poderá. Leve o tempo que precisar.
echo "it takes time" |
{ exec 4>|file ; cat >&4 ; } |
( sleep 1 && cat <file )
it takes time
Aqui está outra maneira:
echo "more of the same" |
( IFS= ; su -mc 'echo '"$(printf "'%s' " "`cat`")"' >|file' </dev/tty ) |
echo end of pipe
Caso contrário, ( subshell )
o comando também $(cat)
ficará </dev/tty
.
Mas se você estiver usando um documento aqui, não precisará de dois 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
RESULTADO:
this is the beginning
of the pipeline
Password:
middle here
this is the end
of the pipeline
A maioria dos itens acima é apenas para demonstração. Tudo o que você realmente precisa é:
su -c 'cat <&3 >./file' 3<<HERE | { wait as needed ; more stuff to do ; }
$(echo "something" | and other things)
HERE