Si je fais:
sudo cat /etc/resolv.conf | less
Il me demandera le mot de passe, même si moins (probablement) prend stdin. Sur quels fd s'affiche l'invite de mot de passe et comment récupère-t-elle l'entrée?
Si je fais:
sudo cat /etc/resolv.conf | less
Il me demandera le mot de passe, même si moins (probablement) prend stdin. Sur quels fd s'affiche l'invite de mot de passe et comment récupère-t-elle l'entrée?
En fait, une invocation typique de sudo
ne lit pas du tout le mot de passe stdin
. Au lieu de cela, sudo
accédera directement au terminal de contrôle (a tty
ou pty
, via le /dev/tty
fichier spécial) et sortira l'invite et lira directement les caractères. Cela peut être vu dans le tgetpass.c
fichier dans la sudo
source.
Il existe quelques autres scénarios:
askpass
programme est spécifié, par exemple dans le -A
param, ce programme sera invoqué.sudo
à lire stdin
, par exemple avec le -S
drapeau - et il écrira également l'invite à stderr
. C'est le cas où la réponse de MadHatter s'applique.tty
disponible
visiblepw
drapeau sudoers
), sudo
signalera une erreur:no tty present and no askpass program specified
sudo
reviendra à utiliser stdin
et stderr
même si cela n'a pas été spécifiquement demandé. La réponse de MadHatter s'appliquera également ici.Le tuyau connecte sudo cat
stdout à less
stdin, donc sudo cat
stdin n'est pas affecté et peut recevoir le mot de passe.
Quant à l'invite, elle s'éteint sur sudo cat
stderr; en bash, essayez de rediriger cela avec stdout, en utilisant
sudo cat /etc/resolv.conf |& less
et voyez à quel point la réponse est différente.
sudo
stdin est toujours connecté au terminal avec l'exemple de commande, cela n'est pas directement pertinent pour la façon dont il obtient son mot de passe: par défaut,sudo
il ne demandera pas de mots de passe via stdin et il ne montrera pas l'invite viastderr
- vous peut essayer2>/dev/null
de le confirmer. Au lieu de cela,sudo
accède directement au tty.