Como o emacs `shell-mode` sabe solicitar o sudo?

17

Em shell-mode, um comando como sudo CMDabre um prompt na área de eco dizendo:

[sudo] password for root: 

Como ele sabe fazer isso? AFAIK, esse comportamento não pode resultar da simples execução, sudocomo de costume, porque o readbuiltin não cria esse prompt.

extremeaxe5
fonte

Respostas:

22

Isso é feito através de um filtro de processo.

Por padrão , comint-output-filter-functionsinclui comint-watch-for-password-prompt, que é a função de filtro que lida com isso.

Se houver texto correspondente comint-password-prompt-regexp, ele solicitará send-invisibleuma senha ao usuário.

Para obter mais informações sobre como os filtros de processo funcionam, consulte C-hig (elisp)Filter Functions


Edit: Como acompanhamento, observe também que você pode M-x toggle-debug-on-quite, no prompt do sudo, digite C-gum backtrace que mostre o que está acontecendo. por exemplo:

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

A saída é mínima porque o código compilado em bytes está sendo avaliado; portanto, os detalhes comint-output-filter-functionssão perdidos, mas você ainda pode ver imediatamente a situação geral. Você também M-x load-library RET comint.el RETpode carregar o código não compilado e repetir todo o processo para obter um rastreamento mais detalhado.

phils
fonte
Ótima dica de depuração!
clemera