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?
źródło
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?
W rzeczywistości typowe wywołanie w sudo
ogóle nie odczytuje hasła stdin
. Zamiast tego sudo
uzyska bezpośredni dostęp do terminala sterującego (a tty
lub pty
, poprzez /dev/tty
specjalny plik) i wyświetli monit i odczyta znaki bezpośrednio. Można to zobaczyć w tgetpass.c
pliku w sudo
źródle.
Istnieje kilka innych scenariuszy:
askpass
określony jest program, np. W -A
parametrze, zostanie on wywołany.sudo
o czytanie stdin
, np. Z -S
flagą - i napisze również monit stderr
. Tak jest w przypadku odpowiedzi MadHattera .tty
dostępny
visiblepw
flagę w sudoers
), sudo
zgłosi błąd:no tty present and no askpass program specified
sudo
wróci do korzystania, stdin
a stderr
nawet jeśli nie zostanie specjalnie zażądane. Odpowiedź MadHattera będzie obowiązywać również tutaj.Rura łączy standardowe sudo cat
wyjście ze less
standardowym wejściem, więc sudo cat
standardowe wejście pozostaje nienaruszone i może otrzymać hasło.
Co do znaku zachęty, to wychodzi na sudo cat
zdziwienie; 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ź.
sudo
stdin 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ślniesudo
nie żąda haseł przez stdin ani nie wyświetla monitu przezstderr
- ty może spróbować2>/dev/null
to potwierdzić. Zamiast tegosudo
uzyskuje bezpośredni dostęp do tty.