Câu trả lời:
Trên thực tế, một lời mời điển hình sudokhông hề đọc mật khẩu stdin. Thay vào đó, sudosẽ truy cập trực tiếp vào thiết bị đầu cuối điều khiển (a ttyhoặc pty, thông qua /dev/ttytệ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.ctập tin trong sudonguồn.
Có một vài tình huống khác:
askpasschương trình được chỉ định, ví dụ trong -Aparam, chương trình đó sẽ được gọi.sudođọc từ stdin, ví dụ với -Scờ - 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.ttycó sẵn
visiblepwcờ trong sudoers), sudosẽ báo lỗi:no tty present and no askpass program specifiedsudosẽ quay trở lại sử dụng stdinvà stderrngay 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 catthiết bị xuất chuẩn với lessstdin, vì vậy sudo catstdin 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 catstderr; 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.
sudostdin 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 địnhsudosẽ 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 đó,sudotruy cập trực tiếp vào tty.