Emacs `kabuk-modu` sudo istemini nasıl bilebilir?


17

İçinde shell-mode, gibi bir komut sudo CMDyankı alanında şöyle bir istem açar:

[sudo] password for root: 

Bunu yapmayı nereden biliyor? AFAIK, bu davranış sudoher zamanki gibi koşmaktan readkurtulamaz , çünkü yerleşik böyle bir istem oluşturmaz.

Yanıtlar:


22

Bu bir işlem filtresi ile yapılır.

Varsayılan olarak comint-output-filter-functions, comint-watch-for-password-promptbunu işleyen filtre işlevidir.

Metin eşleşmesini görürse kullanıcıdan şifre istemek için comint-password-prompt-regexpçağrıda bulunur send-invisible.

İşlem filtrelerinin nasıl çalıştığı hakkında daha fazla bilgi için bkz. C-hig (elisp)Filter Functions


Düzenleme: Bir takip olarak, ayrıca M-x toggle-debug-on-quitve sonra sudo istemi türünde C-gneler olduğunu gösteren bir geri izleme almak için unutmayın. Örneğin:

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

Değerlendirilen bayt-derlenmiş kod nedeniyle çıktı minimumdur, bu nedenle detayı comint-output-filter-functionskaybolur, ancak genel durumu hemen görebilirsiniz. Ayrıca M-x load-library RET comint.el RET, derlenmemiş kodu yükleyebilir ve daha ayrıntılı bir geri izleme elde etmek için tüm işlemi tekrarlayabilirsiniz.


Büyük hata ayıklama ipucu!
clemera
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.