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áteeno 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 porsudodepois. -
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. Primeiramentesudoirá executar e ler a senha do stdin. Se estava tudo bem com a senha, então ele executatee. -
sudolê stdin até que ele atinja um caractere "\ n", então "mypassword \ n" será consumido porsudo. -
teelê 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.