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 sudo
no lee la contraseña stdin
en absoluto. En su lugar, sudo
accederá directamente al terminal de control ( tty
ao pty
, a través del /dev/tty
archivo especial) y generará el mensaje y leerá los caracteres directamente. Esto se puede ver en el tgetpass.c
archivo en la sudo
fuente.
Hay algunos otros escenarios:
askpass
se especifica un programa, por ejemplo, en el -A
parámetro, se invocará ese programa.sudo
leer stdin
, por ejemplo, con la -S
bandera, y también escribirá el mensaje en stderr
. Este es el caso donde se aplica la respuesta de MadHatter .tty
disponible
visiblepw
indicador sudoers
), sudo
informará un error:no tty present and no askpass program specified
sudo
recurrirá al uso stdin
e stderr
incluso si no se solicitó específicamente. La respuesta de MadHatter también se aplicará aquí.La tubería conecta sudo cat
la salida less
estándar a la entrada estándar, por lo que sudo cat
la entrada estándar no se ve afectada y puede recibir la contraseña.
En cuanto al aviso, sale en sudo cat
stderr; en bash, intenta redirigir eso junto con stdout, usando
sudo cat /etc/resolv.conf |& less
y ver cuán diferente es la respuesta.
sudo
el 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/null
confirmar eso. En cambio,sudo
accede directamente al tty.