Isso fará:
echo 'some text' | { echo 'mypassword'; cat -; } | sudo -S tee -a /etc/test.txt &>/dev/null
O ponto é sudo
e tee
usam o mesmo stdin, então ambos lerão da mesma origem. Devemos colocar "mypassword" + "\ n" antes de qualquer coisa que queremos passar para tee
.
Explicando o comando:
-
echo 'some text'
escreve "algum texto \ n" no primeiro canal. Isso é o que alcançarátee
no final. - O comando de grupos de chaves. Podemos olhar para
{...}
como um comando. O que quer que esteja em{...}
, leia do primeiro tubo e escreva para o segundo tubo. -
echo 'mypassword'
irá escrever "mypassword \ n" para o segundo pipe. Isso é lido porsudo
depois. -
cat -
lerá o que vier do primeiro canal e gravará no segundo canal, por isso escreve "algum texto \ n". Agora os dados no segundo canal são "mypassword \ nalgum texto \ n". -
sudo -S tee...
começa a ler o seu stdin, que é o segundo canal. Primeiramentesudo
irá executar e ler a senha do stdin. Se estava tudo bem com a senha, então ele executatee
. -
sudo
lê stdin até que ele atinja um caractere "\ n", então "mypassword \ n" será consumido porsudo
. -
tee
lê stdin e obtém o que sobrou, "algum texto \ n".
Observação: sudo
não pergunta a senha por um tempo após o primeiro uso. Desta forma sudo
não lê de stdin e sua senha no stdin será lida por tee
. Para garantir que sudo
solicite a execução da senha sudo -k
para invalidar as credenciais armazenadas em cache. Então será:
sudo -k && echo 'some text' | { echo 'mypassword'; cat -; } | sudo -S tee -a /etc/test.txt &>/dev/null
PS: Sobre o redirecionamento de E / S: Sim, você está certo, 1>filename
é idêntico a >filename
. Ambos redirecionam o stdout para filename . Também 0<filename
e <filename
são idênticos, ambos redirecionam stdin.