vim रूट के रूप में फिर से संपादित करें


28

मैं अक्सर एक फ़ाइल को विम में खोलता हूं, कुछ बदलाव करता हूं और जब फ़ाइल को सहेजने का समय होता है, तो रीड-ओनली .. (किसी अन्य उपयोगकर्ता के स्वामित्व में)। मैं उन युक्तियों की तलाश कर रहा हूं कि कैसे मैं फ़ाइल को रूट के रूप में फिर से खोल सकता हूं और बिना किसी प्रतिलिपि के लिए इसे एक अस्थायी फ़ाइल में सहेजे बिना अपने परिवर्तनों को रख सकता हूं या रूट के रूप में फिर से संपादित कर सकता हूं।

जवाबों:


42

इस स्टैकओवरफ़्लो उत्तर से , स्किनप द्वारा

:w !sudo tee %

मैं अक्सर एक फ़ाइल को संपादित करने से पहले sudo करना भूल जाता हूं, जिस पर मुझे लिखने की अनुमति नहीं है। जब मैं उस फ़ाइल को सहेजने के लिए आता हूं और अनुमति त्रुटि प्राप्त करता हूं, तो मैं बस उस आदेश को जारी करता हूं ताकि फ़ाइल को बचाने के लिए इसे किसी अस्थायी फ़ाइल में सहेजने की आवश्यकता हो और फिर इसे वापस कॉपी करें।


यह लगभग है .. लेकिन यह अच्छा होगा कि विम को फिर से शुरू किया जाए और रूट के रूप में चलाया जाए .. यह मेरा अब तक का पसंदीदा है :)
rkthkr

@rkthkr, यदि "vim पुनरारंभ और रूट के रूप में चलता है" तो आप अपने द्वारा किए गए किसी भी संपादन को बचाने में असमर्थ होंगे, और अपने पूर्ववत इतिहास को खो देंगे। लेकिन अगर आप चाहते हैं कि ... [पात्रों से बाहर भाग गया।] "जवाब" देखें मैं लिखने वाला हूं।
ब्रूनो ब्रोंस्की

2
@dbr, मुझे लगता है कि यह ध्यान देने योग्य है कि आपके द्वारा फाइल को ओवरराइट करने के बाद (जैसे कि sudo के रूप में), आपको [O] k या [L] oad के साथ संकेत मिलेगा। बाद का विकल्प आपके पूर्ववत इतिहास को मिटा देगा "रीसेट ध्वज" जो आपको परिवर्तनों को बचाने के लिए चेतावनी दिए बिना बाहर निकलने की अनुमति देता है। पूर्व विकल्प, जो मुझे पसंद है, आपके पूर्ववत इतिहास को संरक्षित करेगा, लेकिन जब आप छोड़ने की कोशिश करेंगे तो आपको चेतावनी दी जाएगी। आपको उपयोग करना होगा: क्ष! इस मामले में छोड़ने के लिए। मैं ऐसा कर सकता हूं इसलिए मैं सत्यापित कर सकता हूं (उदाहरण के लिए: sudo /etc/init.d/httpd configtest) और अगर मुझे ज़रूरत हो तो रोलबैक / रीड करें।
ब्रूनो ब्रोंस्की

15

कृपया मुझे इसके लिए वोट न करें। मैं इस उत्तर को लागू करने की अनुशंसा नहीं करता, लेकिन यह वह उत्तर है जो आरक्षक पूछ रहा है।

rkthkr ने कहा:
लेकिन यह अच्छा होगा कि विम को फिर से शुरू किया जाए और रूट के रूप में चलाया जाए

ऐसा करने का तरीका :!sudo vim %
जैसा कि मैंने ipozgaj के साथ उल्लेख किया है, एक तर्क के रूप में एक% (यहां तक ​​कि एक उप-तर्क) वर्तमान बफर के पथ के साथ बदल जाता है। (आपको अपने पासवर्ड के लिए संकेत मिल सकता है।) आप एक नई vim प्रक्रिया के साथ समाप्त होते हैं, जो रूट के स्वामित्व में है, जो कि मूल vim प्रक्रिया की एक बाल प्रक्रिया है। नासमझ, सही लगता है? यहाँ यह कैसा दिखता है ps:

~# ps afo pid,ppid,user,stat,comm
  PID  PPID USER         STAT COMMAND
16187 30478 rbronosky    Ss   bash
16510 16187 rbronosky    R+    \_ ps
30482 30478 rbronosky    Ss   bash
16244 30482 rbronosky    S+    \_ vim
16318 16244 root         S+        \_ vim

यदि आपके पास उस निर्देशिका के लिए अनुमति है जिसमें फ़ाइल सम्‍मिलित है और आपने उसमें संपादन किया है, तो आपको चेतावनी दी जा सकती है कि स्वैप स्‍पेस बाहर निकल जाए। [R] परित्याग के लिए चुनना, मूल vim प्रक्रिया द्वारा किए गए परिवर्तनों के अधिकांश * को प्रतिबिंबित करेगा । (* मुझे लगता है कि शायद स्वैप अपडेट समयबद्ध है या एक डेल्टा सीमा है। मैंने इस पर बहुत समय दिया है और इस पर ध्यान नहीं देना चाहिए।) जब आप जाते हैं और विम छोड़ते हैं, तो आप चिंतित न हों। अभी भी vim में ... आपने दूसरी vim प्रक्रिया खोली है। याद है?

अब, उस सब के साथ कहा ... मैं लगभग ऐसा कभी नहीं होगा। हो सकता है, अगर मेरे पास पर्याप्त या बहुत अधिक कॉफी नहीं थी, और मुझे एहसास हुआ कि मुझे रूट के रूप में कई और फ़ाइलों को संपादित करने की आवश्यकता है ... मैं यह कोशिश कर सकता हूं। 14 साल के प्रशासन प्रणालियों में, मेरे पास कभी नहीं है। लेकिन, जब तक आपने मेरे पसंदीदा समाधान के साथ असंतोष व्यक्त नहीं किया (जो बिल्कुल उसी तरह की पेशकश की गई थी) मैंने इस बारे में कभी नहीं सोचा था।


धन्यवाद रिचर्ड! बहुत जानकारीपूर्ण, मैं आपको इसके लिए +1 दूंगा :)
rkthkr

यह एक बहुत ही उच्च गुणवत्ता वाला उत्तर है: मतदान क्यों? +1 मुझसे भी।
मेई

1
धन्यवाद @ रिचर्ड ब्रोंस्की, मेरे gvim में sudo पासवर्ड टाइप करना संभव नहीं है, :w !sudo tee %इसलिए मुझे लगता है कि यह एक अच्छा उत्तर है।
एरिक फोर्टिस

1

मैं आमतौर पर $ HOME / tmp / apache.conf (उदाहरण के लिए) में एक अस्थायी फ़ाइल में सहेजता हूँ

sudo vimdiff $HOME/tmp/apache.conf /etc/apache2/apache.conf

परिवर्तनों को मर्ज करने के लिए यह कुछ अतिरिक्त काम है लेकिन इसका भुगतान किया गया। मुझे लगता है कि यह अवांछित परिवर्तनों के खिलाफ सुविधा और माप के बीच एक अच्छा तरीका है

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

यह केवल उन फ़ाइलों के लिए जाता है जो अब तक प्रबंधित नहीं हैं। हमारे द्वारा उपयोग किया जाने वाला समग्र समाधान एक गिट रेपो के साथ कठपुतली है जहां लोग स्थानीय रूप से फाइलों को संपादित करते हैं और उपयुक्त सर्वर पर परिवर्तनों का परीक्षण करते हैं, अगर कॉन्फ़िगरेशन वांछित के रूप में काम करता है तो परिवर्तन केंद्रीय भंडार में वापस धकेल दिए जाते हैं जहां हमारा कॉन्फ़िगरेशन इंजन नियमित अंतराल पर परिवर्तन खींचता है।


0

मैं आमतौर पर क्या करता हूं - जरूरी नहीं कि सबसे तेज, लेकिन निश्चित रूप से सुरक्षित है - ऐसा कुछ करना है (उदाहरण के लिए nsswitch.conf का उपयोग करके):

:w! ~/%

विम से बाहर निकलें, फिर करें:

sudo vim nsswitch.conf
1GdG
:r ~/%

यह सभी पंक्तियों को हटा देगा और इसके स्थान पर संपादित किए जाने वाले आपके परिवर्तित और अपडेट किए गए संस्करण में पढ़ेगा। अपने घर की निर्देशिका का उपयोग करने का मतलब है कि आपको इस बारे में सोचने की ज़रूरत नहीं है कि आपके पास पहुंच है या नहीं - और यह / tmp से अधिक निजी है। ध्यान दें कि यह एक पूरी फ़ाइल प्रतिस्थापन है: यदि आप सभी परिवर्तनों को नहीं जोड़ना चाहते हैं, तो आपको चुनना होगा और चुनना होगा।

इनमें से किसी भी उत्तर में शामिल सिरदर्द के बावजूद, आपके परिवर्तनों को खोने का कोई कारण नहीं है।

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