Bagaimana emacs `shell-mode` tahu untuk meminta sudo?


17

Di shell-mode, perintah like sudo CMDmembuka prompt di area echo yang mengatakan:

[sudo] password for root: 

Bagaimana dia tahu melakukan ini? AFAIK, perilaku ini tidak dapat keluar dari hanya berjalan sudoseperti biasa, karena readbuiltin tidak membuat prompt seperti itu.

Jawaban:


22

Ini dilakukan melalui filter proses.

Secara default comint-output-filter-functionstermasuk comint-watch-for-password-prompt, yang merupakan fungsi filter yang menangani ini.

Jika ia melihat teks yang cocok comint-password-prompt-regexpmaka ia send-invisiblememinta pengguna untuk meminta kata sandi.

Untuk informasi lebih lanjut tentang cara kerja filter proses, lihat C-hig (elisp)Filter Functions


Sunting: Sebagai tindak lanjut, perhatikan juga bahwa Anda dapat M-x toggle-debug-on-quitdan kemudian pada jenis sudo prompt C-guntuk mendapatkan backtrace yang akan menunjukkan apa yang terjadi. misalnya:

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>: ")

Outputnya minimal karena kode byte-dikompilasi sedang dievaluasi, jadi detailnya comint-output-filter-functionshilang, tetapi Anda masih dapat segera melihat situasi umum. Anda juga bisa M-x load-library RET comint.el RETmemuat kode yang tidak dikompilasi dan kemudian mengulangi seluruh proses untuk mendapatkan backtrace yang lebih rinci.


Kiat debug hebat!
clemera
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.