Tại sao mật khẩu nhập làm việc trong một lệnh sudo đường ống?


25

Nếu tôi làm:

sudo cat /etc/resolv.conf | less

Nó sẽ nhắc tôi nhập mật khẩu, mặc dù ít hơn (có lẽ) mất stdin. Dấu nhắc mật khẩu được hiển thị trên fd là gì và làm thế nào để nó lấy lại đầu vào?

Câu trả lời:


48

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:

  • Nếu một askpasschương trình được chỉ định, ví dụ trong -Aparam, chương trình đó sẽ được gọi.
  • Mặt khác, nếu bạn đặc biệt yêu cầu 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.
  • Mặt khác, nếu không ttycó sẵn
    • Nếu tiếng vang mật khẩu bị tắt (theo mặc định, được điều khiển bởi visiblepwcờ trong sudoers), sudosẽ báo lỗi:no tty present and no askpass program specified
    • Nếu không, sudosẽ quay trở lại sử dụng stdinstderrngay 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.

10

Đườ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.


16
Mặc dù câu trả lời này là chính xác trong đó 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 định sudosẽ không yêu cầu mật khẩu qua stdin và nó sẽ không hiển thị lời nhắc qua stderr- bạn có thể cố gắng 2>/dev/nullđể xác nhận rằng. Thay vào đó, sudotruy cập trực tiếp vào tty.
Bob
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.