कैसे सूद `खोल-मोड` सूदो के लिए संकेत करने के लिए जानता है?


17

यह कहते हुए कि गूंज क्षेत्र में shell-modeएक कमांड sudo CMDखुल जाती है:

[sudo] password for root: 

यह कैसे करना जानता है? AFAIK, यह व्यवहार sudoसामान्य रूप से चलने से नहीं उठ सकता है , क्योंकि readअंतर्निहित इस तरह का संकेत नहीं देता है।

जवाबों:


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और फिर सूडो प्रॉम्प्ट प्रकार 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असम्बद्ध कोड को लोड करने के लिए भी कर सकते हैं और फिर अधिक विस्तृत बैकट्रेस प्राप्त करने के लिए पूरी प्रक्रिया को दोहरा सकते हैं।


महान डिबगिंग टिप!
क्लेमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.