Odpowiedzi:
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:
askpassokreślony jest program, np. W -Aparametrze, zostanie on wywołany.sudoo czytanie stdin, np. Z -Sflagą - i napisze również monit stderr. Tak jest w przypadku odpowiedzi MadHattera .ttydostępny
visiblepwflagę w sudoers), sudozgłosi błąd:no tty present and no askpass program specifiedsudowróci do korzystania, stdina stderrnawet jeśli nie zostanie specjalnie zażądane. Odpowiedź MadHattera będzie obowiązywać również tutaj.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ź.
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ślniesudonie żąda haseł przez stdin ani nie wyświetla monitu przezstderr- ty może spróbować2>/dev/nullto potwierdzić. Zamiast tegosudouzyskuje bezpośredni dostęp do tty.