Warum funktioniert die Passworteingabe in einem Pipe-Sudo-Befehl?


25

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?

Antworten:


48

Tatsächlich sudoliest ein typischer Aufruf von das Passwort überhaupt nicht aus stdin. Greifen Sie stattdessen sudodirekt auf das steuernde Terminal zu (a ttyoder ptyüber die /dev/ttyspezielle Datei) und geben Sie die Eingabeaufforderung aus und lesen Sie die Zeichen direkt. Dies ist in der tgetpass.cDatei in der sudoQuelle zu sehen.

Es gibt einige andere Szenarien:

  • Wenn ein askpassProgramm angegeben ist, z. B. im -AParameter, wird dieses Programm aufgerufen.
  • Andernfalls fordern Sie ausdrücklich sudodas Lesen an stdin, zB mit dem -SFlag - und es wird auch die Eingabeaufforderung an geschrieben stderr. Dies ist der Fall, in dem die Antwort von MadHatter zutrifft.
  • Andernfalls, wenn keine ttyverfügbar ist
    • Wenn das Passwortecho deaktiviert ist (es wird standardmäßig durch das visiblepwFlag in gesteuert sudoers), sudowird ein Fehler gemeldet:no tty present and no askpass program specified
    • Ansonsten sudowird auf die Nutzung zurückgegriffen stdinund dies stderrauch dann, wenn es nicht ausdrücklich angefordert wurde. Die Antwort von MadHatter gilt auch hier.

10

Die Pipe verbindet sudo catdie Standardausgabe mit lessder Standardausgabe, sodass sudo catdie Standardausgabe nicht betroffen ist und das Kennwort empfangen kann.

Die Eingabeaufforderung erlischt auf sudo catstderr; Versuchen Sie in bash, dies zusammen mit stdout umzuleiten, indem Sie

sudo cat /etc/resolv.conf |& less

und sehen, wie unterschiedlich die Reaktion ist.


16
Während diese Antwort, dass richtig ist sudo‚s ist stdin noch mit dem Beispielbefehl an das Terminal angeschlossen, die nicht direkt relevant ist , wie es sein Passwort bekommt: standardmäßig sudowird fordern keine Passwörter über stdin noch zeigt es die Aufforderung über stderr- Sie kann versuchen, das 2>/dev/nullzu bestätigen. sudoGreift stattdessen direkt auf das tty zu.
Bob
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.