Comment le mode shell d'emacs sait-il inviter sudo?


17

Dans shell-mode, une commande comme sudo CMDouvre une invite dans la zone d'écho disant:

[sudo] password for root: 

Comment sait-il cela? AFAIK, ce comportement ne peut pas découler d'un simple fonctionnement sudocomme d'habitude, car le programme readintégré ne crée pas une telle invite.

Réponses:


22

Cela se fait via un filtre de processus.

Par défaut, comint-output-filter-functionsinclut comint-watch-for-password-prompt, qui est la fonction de filtre qui gère cela.

S'il voit la correspondance de texte, comint-password-prompt-regexpil appelle send-invisiblepour demander à l'utilisateur un mot de passe.

Pour plus d'informations sur le fonctionnement des filtres de processus, reportez-vous à C-hig (elisp)Filter Functions


Modifier: À titre de suivi, notez également que vous pouvez M-x toggle-debug-on-quit, puis à l'invite sudo, tapez C-gpour obtenir une trace qui montrerait ce qui se passe. par exemple:

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

La sortie est minime en raison de l'évaluation du code compilé en octets, donc le détail de comint-output-filter-functionsest perdu, mais vous pouvez toujours voir immédiatement la situation générale. Vous pouvez également M-x load-library RET comint.el RETcharger le code non compilé, puis répéter tout le processus pour obtenir une trace plus détaillée.


Grande astuce de débogage!
clemera
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.