ではshell-mode
、次のようなコマンドをsudo CMD
言ってエコー領域にプロンプトを開きます:
[sudo] password for root:
これを行う方法はどのようにわかりますか?私の知る限り、ビルトインはそのようなプロンプトを作成しないsudo
ので、この動作は通常のように単純に実行することから立ち上がることはできませんread
。
ではshell-mode
、次のようなコマンドをsudo CMD
言ってエコー領域にプロンプトを開きます:
[sudo] password for root:
これを行う方法はどのようにわかりますか?私の知る限り、ビルトインはそのようなプロンプトを作成しないsudo
ので、この動作は通常のように単純に実行することから立ち上がることはできませんread
。
回答:
これは、プロセスフィルターを介して行われます。
デフォルトでcomint-output-filter-functions
はcomint-watch-for-password-prompt
、これを処理するフィルター関数であるが含まれます。
一致するテキストが見つかったcomint-password-prompt-regexp
場合は、呼び出しsend-invisible
てユーザーにパスワードを要求します。
プロセスフィルターの機能の詳細については、 C-hig (elisp)Filter Functions
編集:フォローアップとしてM-x toggle-debug-on-quit
、sudoプロンプトタイプでC-g何が起こっているかを示すバックトレースを取得できることにも注意してください。例えば:
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>: ")
バイトコンパイルされたコードが評価されるため、出力は最小限であるため、詳細comint-output-filter-functions
は失われますが、一般的な状況はすぐに確認できます。またM-x load-library
RET comint.el
RET、コンパイルされていないコードをロードし、プロセス全体を繰り返して、より詳細なバックトレースを取得することもできます。