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?
fuente
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?
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:
askpassse especifica un programa, por ejemplo, en el -Aparámetro, se invocará ese programa.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 .ttydisponible
visiblepwindicador sudoers), sudoinformará un error:no tty present and no askpass program specifiedsudorecurrirá al uso stdine stderrincluso si no se solicitó específicamente. La respuesta de MadHatter también se aplicará aquí.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.
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 predeterminadasudo, no solicitará contraseñas a través de stdin ni mostrará el mensaje a través destderr- usted puede intentar2>/dev/nullconfirmar eso. En cambio,sudoaccede directamente al tty.