¿Por qué el ingreso de contraseña funciona en un comando sudo canalizado?

25

Si lo hago:

sudo cat /etc/resolv.conf | less

Me pedirá la contraseña, aunque menos (presumiblemente) toma stdin. ¿Sobre qué fd se muestra la solicitud de contraseña y cómo recupera la entrada?

Karlo
fuente

Respuestas:

48

En realidad, una invocación típica de sudono lee la contraseña stdinen absoluto. En su lugar, sudoaccederá directamente al terminal de control ( ttyao pty, a través del /dev/ttyarchivo especial) y generará el mensaje y leerá los caracteres directamente. Esto se puede ver en el tgetpass.carchivo en la sudofuente.

Hay algunos otros escenarios:

  • Si askpassse especifica un programa, por ejemplo, en el -Aparámetro, se invocará ese programa.
  • De lo contrario, si solicita específicamente sudoleer stdin, por ejemplo, con la -Sbandera, y también escribirá el mensaje en stderr. Este es el caso donde se aplica la respuesta de MadHatter .
  • De lo contrario, si no hay ttydisponible
    • Si el eco de contraseña está deshabilitado (de forma predeterminada, controlado por el visiblepwindicador sudoers), sudoinformará un error:no tty present and no askpass program specified
    • De lo contrario, sudorecurrirá al uso stdine stderrincluso si no se solicitó específicamente. La respuesta de MadHatter también se aplicará aquí.
Mover
fuente
10

La tubería conecta sudo catla salida lessestándar a la entrada estándar, por lo que sudo catla entrada estándar no se ve afectada y puede recibir la contraseña.

En cuanto al aviso, sale en sudo catstderr; en bash, intenta redirigir eso junto con stdout, usando

sudo cat /etc/resolv.conf |& less

y ver cuán diferente es la respuesta.

MadHatter apoya a Monica
fuente
16
Si bien esta respuesta es correcta, ya que sudoel stdin todavía está conectado al terminal con el comando de ejemplo, eso no es directamente relevante para la forma en que obtiene su contraseña: de manera predeterminada sudo, no solicitará contraseñas a través de stdin ni mostrará el mensaje a través de stderr- usted puede intentar 2>/dev/nullconfirmar eso. En cambio, sudoaccede directamente al tty.
Bob