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.

extremeaxe5
sumber

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.

phils
sumber
Kiat debug hebat!
clemera