¿Cómo sabe emacs `shell-mode` para solicitar sudo?

17

En shell-mode, un comando como sudo CMDabre un mensaje en el área de eco que dice:

[sudo] password for root: 

¿Cómo sabe hacer esto? AFAIK, este comportamiento no puede surgir simplemente de la ejecución sudocomo de costumbre, porque el readincorporado no crea tal aviso.

extremeaxe5
fuente

Respuestas:

22

Esto se hace a través de un filtro de proceso.

Por defecto comint-output-filter-functionsincluye comint-watch-for-password-prompt, que es la función de filtro que maneja esto.

Si ve que el texto coincide comint-password-prompt-regexp, llama send-invisiblepara solicitar al usuario una contraseña.

Para obtener más información sobre cómo funcionan los filtros de proceso, consulte C-hig (elisp)Filter Functions


Editar: Como seguimiento, tenga en cuenta también que puede M-x toggle-debug-on-quity luego, en el indicador de sudo, escriba C-gpara obtener un seguimiento que muestre lo que está sucediendo. p.ej:

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

El resultado es mínimo debido al código compilado de bytes que se está evaluando, por lo que comint-output-filter-functionsse pierde el detalle , pero aún puede ver de inmediato la situación general. También puede M-x load-library RET comint.el RETcargar el código no compilado y luego repetir todo el proceso para obtener un rastreo más detallado.

phils
fuente
Gran sugerencia de depuración!
clemera