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?

Karlo
quelle

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.
Bob
quelle
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.

MadHatter unterstützt Monica
quelle
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