Woher weiß der Emacs-Shell-Modus, dass er zur Eingabe von sudo auffordert?

17

In öffnet shell-modeein Befehl wie sudo CMD:

[sudo] password for root: 

Woher weiß es das zu tun? AFAIK, dieses Verhalten kann nicht durch einfaches Ausführen sudowie gewohnt hervorgerufen werden, da das readeingebaute Programm keine solche Eingabeaufforderung erstellt.

extremeaxe5
quelle

Antworten:

22

Dies geschieht über einen Prozessfilter.

Standardmäßig comint-output-filter-functionsenthält comint-watch-for-password-promptdies die Filterfunktion, die dies behandelt.

Wenn es passenden Text sieht comint-password-prompt-regexpdann ruft es send-invisibleden Benutzer nach einem Kennwort gefragt.

Weitere Informationen zur Funktionsweise von Prozessfiltern finden Sie unter C-hig (elisp)Filter Functions


Bearbeiten: Beachten Sie M-x toggle-debug-on-quitim Nachhinein , dass Sie an der Eingabeaufforderung sudo C-geinen Backtrace eingeben können, der anzeigt , was los ist. z.B:

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

Die Ausgabe ist aufgrund des ausgewerteten Byte-kompilierten Codes minimal, sodass die Details von comint-output-filter-functionsverloren gehen, Sie jedoch die allgemeine Situation immer noch sofort sehen können. Sie können auch M-x load-library RET comint.el RETden nicht kompilierten Code laden und dann den gesamten Vorgang wiederholen, um eine detailliertere Rückverfolgung zu erhalten.

Phils
quelle
Toller Debugging-Tipp!
Clemera