2010-03-18 17 views
13

मैं कुछ सामान्य रूप से प्रयुक्त सूडो शेल कमांड के लिए शॉर्टकट कुंजियां बनाने की कोशिश कर रहा हूं (उदाहरण के लिए, C-c s(shell-command "sudo /etc/init.d/apache2 restart") चलाएं)।मैं Emacs में एक सूडो कमांड कैसे चला सकता हूं?

मैं जैसा कि ऊपर एक सीधे-अप खोल कमान कॉल उपयोग करने की कोशिश, लेकिन यह सिर्फ *Shell Command Output* बफर के लिए निम्न आउटपुट:

[sudo] password for Inaimathi: 
Sorry, try again. 
[sudo] password for Inaimathi: 
Sorry, try again. 
[sudo] password for Inaimathi: 
Sorry, try again. 
sudo: 3 incorrect password attempts 

यह वास्तव में एक पासवर्ड के लिए पूछ नहीं है। मैं sudo emacs का उपयोग करके Emacs शुरू करना नहीं चाहता, लेकिन मुझे लगता है कि यह एक विकल्प है यदि कुछ और काम नहीं करेगा।

आदर्श समाधान Emacs के भीतर से एक कार्य होगा (ओएस जिगरी-पोकर के विपरीत खोल के व्यवहार को बदलने के लिए या sudo कमांड)। कुछ (sudo-shell-command "dostuff"), या (with-password-prompt (shell-command "sudo dostuff")) की तरह कुछ।

+0

संबंधित (डुप्लिकेट के पास?): Http://stackoverflow.com/questions/95631/open-a-file-with-su-sudo-inside-emacs और सुपर उपयोगकर्ता में माइग्रेट करने के लिए वोट सही हो सकता है। @Inaimathi: यदि यह प्रोग्रामिंग के साथ निकटता से जुड़ा हुआ है, तो अब यह बताने का एक अच्छा समय होगा कि क्यों, या यह प्रश्न अधिक उपयुक्त साइट पर ले जाया जाएगा। – dmckee

+2

यह देखते हुए कि ओपी एक कुंजी के लिए कुछ कुरकुरा बांधने की कोशिश कर रहा है, यह मेरे लिए पर्याप्त प्रोग्राम है। कुछ भ्रम को कम करने के लिए – dmckee

+0

पुनर्गठित प्रश्न। – Inaimathi

उत्तर

13

कैसे के बारे में:

(shell-command (concat "echo " (shell-quote-argument (read-passwd "Password? ")) 
         " | sudo -S your_command_here")) 
+0

बिल्कुल सही। दूसरे शब्दों में, मैं आसानी से कुछ कर सकता था '(defun sudo-shell-command (कमांड) (खोल-आदेश (concat "echo" (read-passwd "पासवर्ड:") "| sudo -S" कमांड)) '' । वास्तव में स्रोत कोड में पासवर्ड लिखने से भी काफी बेहतर है। – Inaimathi

3

यदि आप emacs22 या बाद में चल रहे हैं, तो आप केवल emacs से एक खोल शुरू कर सकते हैं और वहां अपने सूडो कमांड चला सकते हैं। यह स्वचालित रूप से अपने पासवर्ड के लिए minibuffer विंडो में आप खींच लेंगे:

M-x shell 
sudo whoami 

यह सिर्फ स्क्रीन के नीचे अपना पासवर्ड नीचे के लिए पूछना चाहिए ( यह प्रदर्शित किए बिना)।

+0

eshell भी अच्छा है :) – rmk

+0

मैं 'ansi-term' पसंद करता हूं;) –

1

sudo पासवर्ड पढ़ने के लिए टर्मिनल डिवाइस (tty) खोलने का प्रयास करता है। आपके Emacs प्रक्रिया में एक नियंत्रण टर्मिनल नहीं हो सकता है। sudo -S इसे पासवर्ड के लिए मानक इनपुट का उपयोग करने के लिए कहता है जो emacs से आना चाहिए।

+0

' (shell-command "sudo -S /etc/init.d/apache2 पुनरारंभ करें") एक ही चीज़ करता है (यानी यह एक मनमाने ढंग से प्रयास करता है पासवर्ड 3 बार, और '* शैल कमांड आउटपुट *' बफर के लिए 3 असफल प्रयास भेजता है। – Inaimathi

+0

और '(खोल-आदेश" गूंज पासवर्ड | sudo -S /etc/init.d/apache2 पुनरारंभ करें ")'? (नहीं कि आदेश में पासवर्ड एन्कोड करने के लिए यह एक अच्छा समाधान है।) –

+0

हाँ। मैं कहीं भी अपने कोड में अपना रूट पासवर्ड नहीं चाहता। ऐसा लगता है कि यह 'सूडो इमैक' चलाने से भी बदतर हो सकता है। -S दृष्टिकोण का सुझाव देने के लिए +1 (भले ही मैंने इसे पहले गलत समझा) – Inaimathi

1

संपादित करें: स्कॉट का उत्तर ऊपर इस हैक के लिए काफी बेहतर है। उसका उपयोग करें।

सम्भावित समाधान:

मुझे पता चला है कि एक डिफ़ॉल्ट पासवर्ड-पूछ उपयोगिता की स्थापना इस समस्या का हल।

मुझे क्या करना है Defaults:ALL askpass=/usr/lib/openssh/gnome-ssh-askpass को /etc/sudoers फ़ाइल में जोड़ें (स्पष्ट रूप से sudo visudo का उपयोग करके)।

Eval-ing (shell-command "sudo /etc/init.d/apache2 restart") अब असफल होने का अनुमान लगाने के बजाय मुझे पासवर्ड के लिए संकेत देता है।

मैं इस उत्तर को स्वीकार नहीं कर रहा हूं जब तक कि यह स्पष्ट न हो कि कोई बेहतर समाधान नहीं है; आदर्श रूप में मुझे ऐसा कुछ चाहिए जो आपके /etc निर्देशिका के आसपास पोक करने की आवश्यकता के बजाय आंतरिक रूप से Emacs को समस्या हल करता है।

+0

बेहतर है, अगर आपके पास सऊडर नियंत्रण है, तो आप इसे सेट अप कर सकते हैं ताकि आपको इन प्रोग्रामों के लिए पासवर्ड के लिए संकेत नहीं दिया जा सके जिन्हें आप अक्सर चलाते हैं । –

3

वर्कअराउंड (बजाय एक Emacs समाधान):

एक ssh कुंजी युग्म सेट करें जिससे कोई पासवर्ड आवश्यक है।

प्रक्रिया:

  1. रन ssh-keygen चाबियों का एक जोड़ी उत्पन्न करने के लिए।उन्हें रखने के लिए एक उपयोगी नाम उन सब को दूसरों से हल एक बार आप खाता प्राप्त
  2. के लिए सार्वजनिक एक $HOME/.ssh को यह
  3. कॉपी करने के लिए उपयोग निजी एक रखें मिल आप बनाती हूँ दें भेजने के खाते के $HOME/.ssh में (आप इसे एक से अधिक भेजने के खातों में नकल कर सकता है, लेकिन यह हर आने वाली मशीन के लिए एक अलग कुंजी युग्म बनाने के लिए बेहतर हो सकता है) भेजने मशीन पर
  4. संपादित $HOME/.ssh/config ssh क्या कुंजी
  5. उपयोग करने के लिए बताने के लिए लाभ
0

मैं रूट के रूप में Emacs से nmap शुरू करने के लिए निम्नलिखित का उपयोग किया

http://nakkaya.com/sudoEl.markdown

+0

वह लिंक मृत दिखाई देता है। क्या कहीं कहीं हम इसे देख सकते हैं? –

11

मैं अक्सर आदेशों Emacs से aptitude update की तरह कहते हैं। scottfrazer का समाधान उतना उपयोगी नहीं हो सकता है। सिंक्रोनस कमांड मुझे लंबे समय तक प्रतीक्षा करते हैं, और यदि आप एक असमर्थित प्रोग्राम निष्पादित करते हैं (उदाहरण के लिए, aptitude, जो ncurses का उपयोग करता है), आप Emacs (सीजी सहायता नहीं करेंगे), और सीपीयू लोड 100% । async-shell-command पर बदलना यह हल करता है।

लेकिन यह भी एक नई समस्या पेश करता है। अपने आदेश में विफल रहता है, तो अपना पासवर्ड *Messages* बफर में खत्म हो जाएगा:

echo PASSWORD | sudo -S aptitude: exited abnormally with code 1. 

वजह है कि मैं निम्नलिखित समाधान का प्रस्ताव है कि: interactive में

(defun sudo-shell-command (command) 
    (interactive "MShell command (root): ") 
    (with-temp-buffer 
    (cd "/sudo::/") 
    (async-shell-command command))) 

यहाँ "एम" minibuffer में प्रोग्राम नाम के लिए संकेत देता, with-temp-buffer एक शम बफर बनाता है, जिसमें हम सूडो प्रॉम्प्ट के लिए TRAMP का उपयोग करने के लिए निर्देशिका को /sudo::/ में बदलते हैं।

यह डेविड कस्त्रप द्वारा sudo command with minibuffer password prompt @ gnu.emacs.help से समाधान है।

नोट, आपको अभी भी aptitude पर कॉल नहीं करना चाहिए, अन्यथा जब तक आप sudo pkill aptitude भेजते हैं, तब तक उपप्रजाति हमेशा के लिए रहेगी।

मैनुअल में shells और processes पर पढ़ें।

+1

धन्यवाद, आपका उत्तर वही है जो मैं ढूंढ रहा था। मुझे लगता है कि इसे सर्वश्रेष्ठ के रूप में चिह्नित किया जाना चाहिए। –

संबंधित मुद्दे