Skąd emacs `shell-mode` wie o monitowaniu o sudo?

17

W shell-modepoleceniu typu sudo CMDotwiera się monit w obszarze echa:

[sudo] password for root: 

Skąd on to robi? AFAIK, to zachowanie nie może powstać po prostu sudoze zwykłego działania, ponieważ readwbudowane nie tworzy takiego monitu.

extremeaxe5
źródło

Odpowiedzi:

22

Odbywa się to za pomocą filtra procesu.

Domyślnie comint-output-filter-functionszawiera comint-watch-for-password-prompt, która obsługuje funkcję filtrującą.

Jeśli widzi dopasowanie tekstu comint-password-prompt-regexp, wywołuje send-invisiblemonit o podanie hasła.

Aby uzyskać więcej informacji na temat działania filtrów procesów, patrz C-hig (elisp)Filter Functions


Edycja: W ramach działań następczych pamiętaj, że możesz, M-x toggle-debug-on-quita następnie w wierszu polecenia sudo wpisać C-gślad, który pokaże, co się dzieje. na przykład:

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

Dane wyjściowe są minimalne ze względu na analizowany kod skompilowany bajtowo, więc szczegóły comint-output-filter-functionssą tracone, ale nadal można natychmiast zobaczyć ogólną sytuację. Możesz także M-x load-library RET comint.el RETzaładować nieskompilowany kod, a następnie powtórzyć cały proces, aby uzyskać bardziej szczegółowy ślad.

phils
źródło
Świetna wskazówka do debugowania!
clemera