Dlaczego wprowadzanie hasła działa w poleceniu sudo w potoku?

25

Jeśli zrobię:

sudo cat /etc/resolv.conf | less

Poprosi mnie o hasło, nawet jeśli mniej (przypuszczalnie) zajmuje standardowe. Ponad jakie fd jest wyświetlany monit o hasło i jak odzyskuje dane wejściowe?

Karlo
źródło

Odpowiedzi:

48

W rzeczywistości typowe wywołanie w sudoogóle nie odczytuje hasła stdin. Zamiast tego sudouzyska bezpośredni dostęp do terminala sterującego (a ttylub pty, poprzez /dev/ttyspecjalny plik) i wyświetli monit i odczyta znaki bezpośrednio. Można to zobaczyć w tgetpass.cpliku w sudoźródle.

Istnieje kilka innych scenariuszy:

  • Jeśli askpassokreślony jest program, np. W -Aparametrze, zostanie on wywołany.
  • W przeciwnym razie, jeśli konkretnie poprosisz sudoo czytanie stdin, np. Z -Sflagą - i napisze również monit stderr. Tak jest w przypadku odpowiedzi MadHattera .
  • W przeciwnym razie, jeśli nie będzie ttydostępny
    • Jeśli echo hasła jest wyłączone (domyślnie jest kontrolowane przez visiblepwflagę w sudoers), sudozgłosi błąd:no tty present and no askpass program specified
    • W przeciwnym razie sudowróci do korzystania, stdina stderrnawet jeśli nie zostanie specjalnie zażądane. Odpowiedź MadHattera będzie obowiązywać również tutaj.
Kok
źródło
10

Rura łączy standardowe sudo catwyjście ze lessstandardowym wejściem, więc sudo catstandardowe wejście pozostaje nienaruszone i może otrzymać hasło.

Co do znaku zachęty, to wychodzi na sudo catzdziwienie; w bash spróbuj przekierować to wraz ze standardowym wyjściem, używając

sudo cat /etc/resolv.conf |& less

i zobacz, jak różna jest odpowiedź.

MadHatter obsługuje Monikę
źródło
16
Chociaż ta odpowiedź jest poprawna, ponieważ sudostdin jest nadal podłączony do terminala za pomocą polecenia przykładowego, nie ma to bezpośredniego związku z tym, w jaki sposób otrzymuje swoje hasło: domyślnie sudonie żąda haseł przez stdin ani nie wyświetla monitu przez stderr- ty może spróbować 2>/dev/nullto potwierdzić. Zamiast tego sudouzyskuje bezpośredni dostęp do tty.
Bob