Wenn ich mache:
sudo cat /etc/resolv.conf | less
Es fordert mich zur Eingabe des Passworts auf, obwohl weniger (vermutlich) stdin benötigt. Über welchen FDS wird die Passwortabfrage angezeigt und wie erhält sie die Eingabe zurück?
quelle
Wenn ich mache:
sudo cat /etc/resolv.conf | less
Es fordert mich zur Eingabe des Passworts auf, obwohl weniger (vermutlich) stdin benötigt. Über welchen FDS wird die Passwortabfrage angezeigt und wie erhält sie die Eingabe zurück?
Tatsächlich sudo
liest ein typischer Aufruf von das Passwort überhaupt nicht aus stdin
. Greifen Sie stattdessen sudo
direkt auf das steuernde Terminal zu (a tty
oder pty
über die /dev/tty
spezielle Datei) und geben Sie die Eingabeaufforderung aus und lesen Sie die Zeichen direkt. Dies ist in der tgetpass.c
Datei in der sudo
Quelle zu sehen.
Es gibt einige andere Szenarien:
askpass
Programm angegeben ist, z. B. im -A
Parameter, wird dieses Programm aufgerufen.sudo
das Lesen an stdin
, zB mit dem -S
Flag - und es wird auch die Eingabeaufforderung an geschrieben stderr
. Dies ist der Fall, in dem die Antwort von MadHatter zutrifft.tty
verfügbar ist
visiblepw
Flag in gesteuert sudoers
), sudo
wird ein Fehler gemeldet:no tty present and no askpass program specified
sudo
wird auf die Nutzung zurückgegriffen stdin
und dies stderr
auch dann, wenn es nicht ausdrücklich angefordert wurde. Die Antwort von MadHatter gilt auch hier.Die Pipe verbindet sudo cat
die Standardausgabe mit less
der Standardausgabe, sodass sudo cat
die Standardausgabe nicht betroffen ist und das Kennwort empfangen kann.
Die Eingabeaufforderung erlischt auf sudo cat
stderr; Versuchen Sie in bash, dies zusammen mit stdout umzuleiten, indem Sie
sudo cat /etc/resolv.conf |& less
und sehen, wie unterschiedlich die Reaktion ist.
sudo
‚s ist stdin noch mit dem Beispielbefehl an das Terminal angeschlossen, die nicht direkt relevant ist , wie es sein Passwort bekommt: standardmäßigsudo
wird fordern keine Passwörter über stdin noch zeigt es die Aufforderung überstderr
- Sie kann versuchen, das2>/dev/null
zu bestätigen.sudo
Greift stattdessen direkt auf das tty zu.