Perché l'immissione della password funziona in un comando sudo convogliato?


25

Se lo faccio:

sudo cat /etc/resolv.conf | less

Mi chiederà la password, anche se meno (presumibilmente) richiede stdin. Su quali fd viene visualizzata la richiesta della password e come viene restituito l'input?

Risposte:


48

In realtà, una tipica chiamata di sudonon legge affatto la password stdin. Al contrario, sudoaccederà direttamente al terminale di controllo (a ttyo pty, tramite il /dev/ttyfile speciale) e genererà il prompt e leggerà direttamente i caratteri. Questo può essere visto nel tgetpass.cfile nel sudosorgente.

Esistono alcuni altri scenari:

  • Se askpassviene specificato un programma, ad es. Nel -Aparametro, verrà richiamato quel programma.
  • Altrimenti, se si richiede espressamente sudodi leggere stdin, ad esempio con il -Sflag - e scriverà anche il prompt stderr. Questo è il caso in cui si applica la risposta di MadHatter .
  • Altrimenti, se non è ttydisponibile
    • Se l'eco della password è disabilitata (per impostazione predefinita, controllata dal visiblepwflag in sudoers), sudoverrà segnalato un errore:no tty present and no askpass program specified
    • Altrimenti, sudotornerà all'utilizzo stdine stderranche se non è stato specificamente richiesto. La risposta di MadHatter si applicherà anche qui.

10

La pipe collega lo sudo catstdout allo lessstdin, quindi lo sudo catstdin non è interessato e può ricevere la password.

Per quanto riguarda il prompt, si spegne sullo sudo catstderr; in bash, prova a reindirizzare questo insieme a stdout, usando

sudo cat /etc/resolv.conf |& less

e vedere quanto è diversa la risposta.


16
Mentre questa risposta è corretta in quanto lo sudostdin è ancora collegato al terminale con il comando di esempio, questo non è direttamente rilevante per come ottiene la sua password: per impostazione predefinita sudonon richiederà le password tramite stdin né mostrerà il prompt tramite stderr- tu può provare 2>/dev/nulla confermarlo. Invece, sudoaccede direttamente a tty.
Bob,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.