Por que a inserção de senha funciona em um comando sudo canalizado?

25

Se eu fizer:

sudo cat /etc/resolv.conf | less

Ele solicitará a senha, apesar de menos (presumivelmente) levar stdin. Sobre quais comandos de fd é exibido o prompt de senha e como ele recupera a entrada?

Karlo
fonte

Respostas:

48

Na verdade, uma chamada típica de sudonão lê a senha stdin. Em vez disso, sudoacessará diretamente o terminal de controle (a ttyou pty, através do /dev/ttyarquivo especial) e emitirá o prompt e lerá os caracteres diretamente. Isso pode ser visto no tgetpass.carquivo na sudofonte.

Existem alguns outros cenários:

  • Se um askpassprograma for especificado, por exemplo, no -Aparâmetro, esse programa será chamado.
  • Caso contrário, se você solicitar especificamente sudoa leitura de stdin, por exemplo, com a -Sbandeira - e ela também escreverá o prompt em stderr. É o caso em que a resposta do MadHatter se aplica.
  • Caso contrário, se não houver ttydisponível
    • Se o eco da senha estiver desativado (por padrão, controlado pelo visiblepwsinalizador sudoers), sudoserá relatado um erro:no tty present and no askpass program specified
    • Caso contrário, sudovoltará a usar stdine, stderrmesmo que não tenha sido solicitado especificamente. A resposta do MadHatter também será aplicada aqui.
Prumo
fonte
10

O pipe conecta sudo cato stdout ao lessstdin, para que sudo cato stdin não seja afetado e possa receber a senha.

Quanto ao prompt, ele sai no sudo catstderr; no bash, tente redirecioná-lo junto com stdout, usando

sudo cat /etc/resolv.conf |& less

e veja quão diferente é a resposta.

MadHatter apoia Monica
fonte
16
Embora esta resposta esteja correta, pois sudoo stdin ainda está conectado ao terminal com o comando de exemplo, isso não é diretamente relevante para a maneira como obtém sua senha: por padrão sudo, não solicitará senhas via stdin nem exibirá o prompt via stderr- você pode tentar 2>/dev/nullconfirmar isso. Em vez disso, sudoacessa diretamente o tty.
27415 Bob