emacs `โหมดเชลล์ 'รู้ได้อย่างไรว่าพร้อมท์สำหรับ sudo?


17

ในshell-modeคำสั่งเช่นsudo CMDเปิดพรอมต์ในพื้นที่ echo ว่า:

[sudo] password for root: 

มันจะรู้ได้อย่างไรว่าจะทำเช่นนี้? AFAIK พฤติกรรมนี้ไม่สามารถวิ่งออกมาได้ง่ายsudoเหมือนปกติเพราะreadbuiltin ไม่ได้สร้างพรอมต์ดังกล่าว

คำตอบ:


22

สิ่งนี้ทำผ่านตัวกรองกระบวนการ

โดยค่าเริ่มต้น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เพื่อรับ backtrace ซึ่งจะแสดงสิ่งที่เกิดขึ้น เช่น:

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โหลดรหัสที่ไม่ได้คอมไพล์แล้วทำซ้ำกระบวนการทั้งหมดเพื่อรับ backtrace ที่มีรายละเอียดมากขึ้น


เคล็ดลับการดีบักที่ยอดเยี่ยม!
clemera
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.