Come fa Emacs `shell-mode` a chiedere di richiedere sudo?


17

In shell-mode, un comando come sudo CMDapre un prompt nell'area dell'eco che dice:

[sudo] password for root: 

Come fa a saperlo? AFAIK, questo comportamento non può derivare dalla semplice esecuzione sudocome al solito, perché il readbuilt-in non crea tale prompt.

Risposte:


22

Questo viene fatto tramite un filtro di processo.

Di default comint-output-filter-functions include comint-watch-for-password-prompt, che è la funzione di filtro che gestisce questo.

Se vede la corrispondenza del testo comint-password-prompt-regexp , chiama send-invisibleper richiedere all'utente una password.

Per ulteriori informazioni sul funzionamento dei filtri di processo, consultare C-hig (elisp)Filter Functions


Modifica: come follow-up, nota anche che puoi M-x toggle-debug-on-quite quindi al prompt dei comandi sudoC-g un backtrace che mostrerebbe cosa sta succedendo. per esempio:

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

L'output è minimo a causa della valutazione del codice compilato in byte, quindi il dettaglio di comint-output-filter-functionsviene perso, ma è ancora possibile vedere immediatamente la situazione generale. È inoltre M-x load-library RET comint.el RETpossibile caricare il codice non compilato e quindi ripetere l'intero processo per ottenere un backtrace più dettagliato.


Ottimo consiglio di debug!
Clemera,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.