Frage Warum funktioniert die Passworteingabe in einem piped sudo-Befehl?


Wenn ich mache:

sudo cat /etc/resolv.conf | less

Es wird mich nach dem Passwort fragen, auch wenn weniger (vermutlich) Standard ist. Über welche FDs wird die Passwortabfrage angezeigt und wie bekommt sie die Eingabe zurück?


24
2017-10-27 08:31


Ursprung




Antworten:


Eigentlich eine typische Invokation von sudo liest das Passwort nicht aus stdin überhaupt. Stattdessen, sudo wird direkt auf das steuernde Terminal zugreifen (a tty oder ptyüber die /dev/tty spezielle Datei) und gibt die Eingabeaufforderung aus und liest Zeichen direkt. Dies kann in der gesehen werden tgetpass.c Datei in der sudo Quelle.

Es gibt ein paar andere Szenarien:

  • Wenn ein askpass Programm ist spezifiziert, z.B. in dem -A param, dieses Programm wird aufgerufen.
  • Andernfalls, wenn Sie dies ausdrücklich wünschen sudo von lesen stdin, z.B. mit dem -S Flagge - und es wird auch die Aufforderung zu schreiben stderr. Dies ist der Fall, in dem MadHatters Antwort gilt.
  • Ansonsten, wenn es keine gibt tty verfügbar
    • Wenn das Passwort-Echo deaktiviert ist (standardmäßig wird es vom visiblepw Flagge ein sudoers), sudo wird einen Fehler melden: no tty present and no askpass program specified
    • Andernfalls, sudo wird zurückfallen zu verwenden stdin und stderr auch wenn es nicht speziell angefordert wurde. MadHatters Antwort wird auch hier gelten.

47
2017-10-27 12:55





Das Rohr verbindet sich sudo cat's stout zu less's stdin, so sudo cat's stdin ist nicht betroffen und kann das Passwort erhalten.

Was die Aufforderung angeht, geht es weiter sudo cat's stderr; in bash, versuchen Sie es mit STDOUT umleiten, mit

sudo cat /etc/resolv.conf |& less

und sehen, wie unterschiedlich die Antwort ist.


10
2017-10-27 08:37



Während diese Antwort darin richtig ist sudo's stdin ist immer noch mit dem Beispiel-Befehl mit dem Terminal verbunden, das ist nicht direkt relevant für die Art und Weise, wie es sein Passwort erhält: standardmäßig sudo Passwörter werden weder über stdin abgefragt, noch wird die Eingabeaufforderung angezeigt stderr -- Du kannst es versuchen 2>/dev/null um das zu bestätigen. Stattdessen, sudo greift direkt auf die tty zu. - Bob