canaliza a senha para 'sudo' e outros dados para o comando 'sudo'ed

2

Ambos os comandos funcionam: (observe o -S em sudo diz ao sudo para ler a senha do 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

Agora eu gostaria de combinar os dois, ou seja, conseguir tudo em apenas uma linha. Mas, claro, algo assim não funciona:

echo -e '\nsome\nmore\ntext' | echo 'mypassword' | sudo -S tee -a /etc/test.txt &> /dev/null

O que funcionaria? Obrigado :) - Loady

PS: pergunta não relacionada menor: é 1 > idêntico a > ? Eu acredito que eles são ..

    
por Anthony Webber 12.09.2017 / 14:46

3 respostas

1

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 por sudo 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. Primeiramente sudo irá executar e ler a senha do stdin. Se estava tudo bem com a senha, então ele executa tee .
  • sudo lê stdin até que ele atinja um caractere "\ n", então "mypassword \ n" será consumido por sudo .
  • 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.

    
por 12.09.2017 / 17:01
1

Isso é um pouco tarde, mas acho que isso funciona bem:

sudo -k && echo -e "password\ntext" | sudo -S tee file > /dev/null 2>&1

Isso não requer vários canais e é mais simples de entender.

> /dev/null 2>&1

Isso redireciona todas as saídas, incluindo a que pede senha para / dev / null.

    
por 24.06.2018 / 05:42
0

Não foi possível colocar em um comentário, mas observe que você pode combinar a opção -k com o comando sudo já existente, ou seja, em vez de usar

sudo -k && echo 'some text' | { echo 'mypassword'; cat -; } | sudo -S tee -a /etc/test.txt &>/dev/null

você pode colocar diretamente o -k no original sudo . Pode até ser "mais seguro":

echo 'some text' | { echo 'mypassword'; cat -; } | sudo -k -S tee -a /etc/test.txt &>/dev/null
    
por 04.01.2018 / 22:04