Câu trả lời:
Trên thực tế, một lời mời điển hình sudo
không hề đọc mật khẩu stdin
. Thay vào đó, sudo
sẽ truy cập trực tiếp vào thiết bị đầu cuối điều khiển (a tty
hoặc pty
, thông qua /dev/tty
tệp đặc biệt) và xuất trực tiếp lời nhắc và đọc các ký tự. Điều này có thể được nhìn thấy trong các tgetpass.c
tập tin trong sudo
nguồn.
Có một vài tình huống khác:
askpass
chương trình được chỉ định, ví dụ trong -A
param, chương trình đó sẽ được gọi.sudo
đọc từ stdin
, ví dụ với -S
cờ - và nó cũng sẽ viết lời nhắc đến stderr
. Đây là trường hợp câu trả lời của MadHatter được áp dụng.tty
có sẵn
visiblepw
cờ trong sudoers
), sudo
sẽ báo lỗi:no tty present and no askpass program specified
sudo
sẽ quay trở lại sử dụng stdin
và stderr
ngay cả khi nó không được yêu cầu cụ thể. Câu trả lời của MadHatter cũng sẽ được áp dụng ở đây.Đường ống kết nối sudo cat
thiết bị xuất chuẩn với less
stdin, vì vậy sudo cat
stdin không bị ảnh hưởng và có thể nhận được mật khẩu.
Đối với lời nhắc, nó đi ra khỏi sudo cat
stderr; trong bash, hãy thử chuyển hướng cùng với thiết bị xuất chuẩn, sử dụng
sudo cat /etc/resolv.conf |& less
và xem phản ứng khác nhau như thế nào.
sudo
stdin vẫn được kết nối với thiết bị đầu cuối bằng lệnh ví dụ, nhưng điều đó không liên quan trực tiếp đến cách lấy mật khẩu của nó: theo mặc địnhsudo
sẽ không yêu cầu mật khẩu qua stdin và nó sẽ không hiển thị lời nhắc quastderr
- bạn có thể cố gắng2>/dev/null
để xác nhận rằng. Thay vào đó,sudo
truy cập trực tiếp vào tty.