Por que a entrada de senha funciona em um comando sudo canalizado?

24

Se eu fizer:

sudo cat /etc/resolv.conf | less

Ele me solicitará a senha, mesmo que menos (presumivelmente) tome stdin. Sobre o que é o prompt de senha mostrado e como ele recebe a entrada de volta?

    
por Karlo 27.10.2015 / 08:31

2 respostas

47

Na verdade, uma chamada típica de sudo não lê a senha de stdin . Em vez disso, sudo acessará diretamente o terminal de controle (um tty ou pty , através do arquivo /dev/tty special) e emitirá o prompt e lerá os caracteres diretamente. Isso pode ser visto no arquivo tgetpass.c na sudo source.

Existem alguns outros cenários:

  • Se um programa askpass for especificado, por exemplo no -A param, esse programa será invocado.
  • Caso contrário, solicite especificamente sudo para ler stdin , por exemplo com o -S flag - e também gravará o prompt para stderr . Este é o caso em que a resposta de MadHatter se aplica.
  • Caso contrário, se não houver tty disponível
    • Se o eco da senha estiver desabilitado (por padrão, controlado pelo sinal visiblepw em sudoers ), sudo informará um erro: no tty present and no askpass program specified
    • Caso contrário, sudo voltará a usar stdin e stderr , mesmo que não tenha sido solicitado especificamente. A resposta de MadHatter também será aplicada aqui.
por 27.10.2015 / 12:55
10

O canal conecta o stdout de sudo cat à stdin de less , portanto, o stdin de sudo cat não é afetado e é capaz de receber a senha.

Quanto ao prompt, ele sai no stderr de sudo cat ; no bash, tente redirecionar isso junto com stdout, usando

sudo cat /etc/resolv.conf |& less

e veja como a resposta é diferente.

    
por 27.10.2015 / 08:37