Làm thế nào để emacs `shell-mode` biết nhắc nhở cho sudo?


17

Trong shell-mode, một lệnh như sudo CMDmở ra một dấu nhắc trong vùng echo cho biết:

[sudo] password for root: 

Làm thế nào nó biết để làm điều này? AFAIK, hành vi này không thể phát sinh sudokhi chạy đơn giản như bình thường, vì readnội dung dựng sẵn không tạo ra lời nhắc như vậy.

Câu trả lời:


22

Điều này được thực hiện thông qua một bộ lọc quy trình.

Theo mặc định comint-output-filter-functionsbao gồm comint-watch-for-password-prompt, đó là chức năng lọc xử lý việc này.

Nếu nó thấy văn bản khớp comint-password-prompt-regexpthì nó gọi send-invisibleđể nhắc người dùng nhập mật khẩu.

Để biết thêm thông tin về cách hoạt động của các bộ lọc quy trình, hãy tham khảo C-hig (elisp)Filter Functions


Chỉnh sửa: Để theo dõi, cũng lưu ý rằng bạn có thể M-x toggle-debug-on-quitvà sau đó tại loại dấu nhắc sudo C-gđể có một backtrace sẽ hiển thị những gì đang diễn ra. ví dụ:

Debugger entered--Lisp error: (quit)
  read-string("[sudo] password for <username>: " nil t nil)
  read-passwd("[sudo] password for <username>: ")
  send-invisible("[sudo] password for <username>: ")
  comint-watch-for-password-prompt("[sudo] password for <username>: ")
  run-hook-with-args(comint-watch-for-password-prompt "[sudo] password for <username>: ")
  comint-output-filter(#<process shell> "[sudo] password for <username>: ")

Đầu ra là tối thiểu trên tài khoản của mã biên dịch byte được đánh giá, do đó chi tiết comint-output-filter-functionsbị mất, nhưng bạn vẫn có thể thấy ngay tình huống chung. Bạn cũng có thể M-x load-library RET comint.el RETtải mã chưa được biên dịch và sau đó lặp lại toàn bộ quá trình để có được một backtrace chi tiết hơn.


Mẹo gỡ lỗi tuyệt vời!
clemera
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.