Emacs के अंदर su / sudo के साथ एक फ़ाइल खोलें


174

मान लीजिए मैं का उपयोग कर एक मौजूदा Emacs सत्र में एक फ़ाइल खोलना चाहते suया sudo, एक खोल करने के लिए नीचे गिरा कर के बिना sudoeditया sudo emacs। ऐसा करने का एक तरीका है

C-x C-f /sudo::/path/to/file

लेकिन इसके लिए SSH के माध्यम से एक महंगी राउंड-ट्रिप की आवश्यकता होती है । क्या कोई और सीधा रास्ता है?

[EDIT] @JBB सही है। मैं खुले में शौच करने su/ sudoबचाने के लिए आह्वान करने में सक्षम होना चाहता हूं । बचत करते समय इसे फिर से अधिकृत करना ठीक (लेकिन आदर्श नहीं) होगा। क्या मैं के लिए देख रहा हूँ है की विविधताओं find-fileऔरsave-buffer है कि हो सकता है के माध्यम से "पहुंचाया" su/ sudo


5
मैं सिर्फ यह नोट करना चाहता था कि emacs22 के बाद से ट्रम्प डिफ़ॉल्ट रूप से स्थापित हो जाता है, इसलिए ज्यादातर लोग समस्या के बिना Cc Cf / sudo :: / path-to / file कर सकते हैं।
भूलभुलैया

1
sudoeditउल्लेख के लिए धन्यवाद । बहुत उपयोगी।
tshepang

6
Cc Cf Cx Cf होना चाहिए?
जेम्स.एक्सयू

जवाबों:


64

ट्रम्प के बारे में अच्छी बात यह है कि जब आप पहली फ़ाइल खोलते हैं तो आप केवल उस दौर की SSH के लिए भुगतान करते हैं। सूडो तब आपकी साख को मिटाता है, और Emacs एक हैंडल को बचाता है, ताकि बाद में सूडो द्वारा खोली गई फ़ाइलों को बहुत कम समय लगे।

मुझे बोझ को बचाने के लिए अतिरिक्त समय नहीं मिला है, या तो। यह काफी तेज है, आई.एम.ओ.


3
एक सेकंड रुको ... कैश कितनी बार समाप्त होता है?
क्रिस कॉनवे

20
ट्राम एसएसएच के माध्यम से गोल-यात्रा नहीं करता है , यह एक उपधारा का उपयोग करता है ।
टेड्डी

मेरा कहना वास्तव में था कि आप पहली बार खोली गई फ़ाइल के लिए लागत का भुगतान करते हैं, और किसी अन्य के लिए नहीं।
EfForEffort

62

ट्रम्प एसएसएच के माध्यम से राउंड-ट्रिप सूडो नहीं करता है , यह एक सबमिशन का उपयोग करता है । मैनुअल देखें: https://www.gnu.org/software/tramp/#Inline-methods

इसलिए, मेरा सुझाव है कि आप TRAMP के साथ रहें।


18

यदि आप उपयोग करते हैं helm, तो helm-find-filesफ़ाइल को रूट के रूप में खोलने का समर्थन करता है C-c r


यह काम करता है, लेकिन यह एक सत्र में लगातार लगता है, बाद में प्रत्येक फ़ाइल को रूट के रूप में खोला और सहेजा जाता है। प्रलेखन में कुछ भी नहीं है M-x helm-find-files C-c ?जो बताता है कि उपयोगकर्ता के रूप में खोलने के सामान्य मोड पर कैसे लौटना है। C-c rफिर से करना यह बंद नहीं करता है।
लियाम

जब मैं उस सुविधा का उपयोग करता हूं, तो मैं अभी भी एक सामान्य उपयोगकर्ता के रूप में फ़ाइल खोलने में सक्षम हूं।
कुदित

यह बहुत अजीब है - कुछ फाइलें ठीक हैं, कुछ इसे जड़ के रूप में खोलने की कोशिश करती हैं। मैंने emacs कमांड के साथ रूट पासवर्ड को मार दिया sudo -kऔर फिर यह पासवर्ड के लिए संकेत देता है। मैंने Emacs को पुनः आरंभ किया और इससे समस्या समाप्त नहीं हुई। मैंने चारों ओर खोदा .emacs.dऔर ट्रम्प के कुछ संदर्भों को पाया, इसलिए मैंने उन्हें हटा दिया। अब यह बेहतर लगता है लेकिन यकीन नहीं होता कि मैं इससे मुक्त हूं।
लियाम

15

वास्तव में मूल प्रश्न का उत्तर नहीं है, लेकिन यहां एक सहायक कार्य है ताकि ट्रम्प / सुडो मार्ग को थोड़ा आसान किया जा सके:

(मानहानि सूदो-खोज-फ़ाइल (फ़ाइल-नाम)
  "फ़ाइल ढूंढें, लेकिन रूट के रूप में फ़ाइल खोलता है।"
  (इंटरैक्टिव "FSudo फाइल खोजें:")
  (चलो (tramp-file-name (concat "/ sudo ::") (विस्तार-फ़ाइल-नाम फ़ाइल-नाम)))
    (फ़ाइल-ट्राम-फ़ाइल-नाम ढूंढें))

मुझे लगता है कि Emacs स्टार्टर किट में कुछ समान है esk-sudo-edit
मृगमयी


4

आपका उदाहरण बिल्कुल शुरू नहीं होता है, कम से कम मेरे संस्करण ("2.1.13-पूर्व") के संस्करण के साथ नहीं। फाइंड-फाइल और सेव-बफर दोनों ही बढ़िया काम करते हैं।


आपके पास अपने क्रेडेंशियल्स कैश्ड हो सकते हैं। जब TRAMP पहली बार शुरू होता है, यह SSH सामान के 10-15 सेकंड के माध्यम से चला जाता है। (मैंने 2.1.13-प्री भी प्राप्त किया है।)
क्रिस कॉनवे

क्या आपको यकीन है? मेरा मतलब है, यह एक सबशेल शुरू होना चाहिए, लेकिन लोकलहोस्ट के लिए एसएसएच सत्र नहीं। पहली बार सभी TRAMP ऑटो-स्निफ़ को चलाने के लिए लगभग 5 सेकंड लगते हैं।
jfm3

खैर, नहीं, मुझे यकीन नहीं है। मुझे कहना चाहिए कि TRAMP (शायद SSH) सामान के 10-15 सेकंड हैं। मैं एसएसएच प्रति से संबंधित नहीं हूं, लेकिन शुरू करने में अंतराल के बारे में हूं। कब तक यह स्टार्टअप सामग्री बनी रहती है?
क्रिस कॉनवे

जब आप इसे करते हैं तो यह केवल एक सेकंड से अधिक समय लेना चाहिए। यही है, भले ही आप / sudo :: फ़ाइल सहेजते हैं, बफर हटाते हैं, और / sudo :: file2, file2 को जल्दी से खोलना चाहिए। और यह खोल को खुला रखता है, और इसके सभी सूँघने के परिणामों को कैश करता है।
jfm3

लेकिन क्या क्रेडेंशियल कैश किए गए हैं: (1) उस Emacs प्रक्रिया के लिए या (2) सभी Emacs प्रक्रियाओं के लिए? और क्या वे समाप्त हो जाते हैं: (ए) जब एमएसीएस बंद हो जाता है, (बी) कुछ निश्चित समय अवधि (घंटे? दिन? सप्ताह?), या (सी) एक सिस्टम रिबूट के बाद?
क्रिस कॉनवे

3

मैं आपको सलाह देने वाले आदेशों का उपयोग करने की सलाह देता हूं। इस फंक्शन को अपने ~ / .emacs में डालें

(defadvice ido-find-file (after find-file-sudo activate)
  "Find file as root if necessary."
  (unless (and buffer-file-name
               (file-writable-p buffer-file-name))
    (find-alternate-file (concat "/sudo:root@localhost:" buffer-file-name))))

बस स्पष्ट इंगित करने के लिए, यह आवश्यक है कि आप ido-find-fileफ़ाइलों को खोजने के लिए उपयोग कर रहे हैं ।
ट्रिपल

1

(केवल स्थानीय रूप से काम करता है। ट्राम के माध्यम से सही ढंग से काम करने के लिए अद्यतन किए जाने की आवश्यकता है)

थोड़ा सा बढ़ाया गया बर्टन का जवाब:

(defun sudo-find-file (file-name)
"Like find file, but opens the file as root."
(interactive "FSudo Find File: ")
(let ((tramp-file-name (concat "/sudo::" (expand-file-name file-name))))
(find-file tramp-file-name)))


(add-hook 'dired-mode-hook
    (lambda ()
      ;; open current file as sudo 
      (local-set-key (kbd "C-x <M-S-return>") (lambda()
        (interactive)
        (message "!!! SUDO opening %s" (dired-file-name-at-point))
        (sudo-find-file (dired-file-name-at-point))
      ))
    )
)

0

ओह। शायद आप Emacs में एक खोल खोल सकते हैं और sudo emacs निष्पादित कर सकते हैं।

समस्या यह है कि आप संभवतः फ़ाइल को खोलना नहीं चाहते हैं। आप इसे बाद में सहेजने में सक्षम होना चाहते हैं। इस प्रकार आपको अपने मूल निजी को बनाए रखने की आवश्यकता है, न कि केवल फ़ाइल खोलने के लिए मौजूद है।

लगता है जैसे आप चाहते हैं कि Emacs आपके विंडो मैनेजर बनें। यह उसके बिना पर्याप्त रूप से फूला हुआ है। :)


11
हा हा आपने ब्लोट कहा। Emacs बहुत बड़ा लगता था। अब, जावा, रूबी, और शायद अन्य सामान के ढेर के रन-टाइम पैरों की तुलना में, यह काफी दुबला दिखता है। भले ही, मुझे लगता है कि क्रिस का सवाल एमएसीएस के पूरी तरह से वैध उपयोग पर है।
jfm3

1
आपने मुझे इसमें हरा दिया। मैं इस मॉडल का लगातार उपयोग करता हूं। लॉगिन पर मैं सामान्य सामान के लिए एक एमएसीएस सत्र शुरू करता हूं, एक एसयू एक्सेस (रूट के रूप में) और एक या अधिक सॉफ्टवेयर विकास के लिए (आमतौर पर प्रति-प्रोजेक्ट लेकिन हमेशा नहीं)। सालों से कर रहे हैं। बस काम करता है।
पजतो ०

क्या आप यह स्पष्ट कर सकते हैं कि यह कैसे करना है: "Emacs में एक खोल खोलें और sudo emacs
निष्पादित करें

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