केवल फ़ाइल पढ़ने-लिखने के बावजूद Vi फाइल करने के लिए लिख सकता है


12

निम्न उदाहरण दिखाते हैं कि केवल पढ़ने की अनुमति वाली फ़ाइल कैसे बनाई जाए। जैसा कि हम देख सकते हैं, जब मैं इस फाइल को लिखने की कोशिश करता हूं, जो मुझे मिलती है, इको कमांड का उपयोग करके Permission denied

लेकिन क्यों, इस मामले में कि हम vi का उपयोग करते हैं, क्या हमें नहीं मिलता है Permission denied? जैसा कि यहां देखा जा सकता है, हम फ़ाइल को केवल पठन-पाठन के लिए लिख सकते हैं।

यहां क्या हो रहा है? क्या यह vi बग है?

[admin@madona-machine1 ~]$ touch test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-rw-r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ chmod -w  test-file
[admin@madona-machine1 ~]$ ls -ltr
total 0
-r--r--r-- 1 admin admin 0 Apr 13 07:32 test-file
[admin@madona-machine1 ~]$ echo try_to_write > test-file
-bash: test-file: Permission denied
[admin@madona-machine1 ~]$ vi test-file

I am good singer,

 ~
 ~
 ~
 ~
 ~
 ~
 ~                                                
   "test-file" 1L, 4C written

1
FYI करें इसके लिए एक बीटा SE साइट है - vi.stackexchange.com
Raystafarian

जवाबों:


28

नोट : विरासत लाइसेंसिंग कारणों के कारण, अधिकांश GNU / लिनक्स वितरण में बिल जॉय द्वारा लिखित मूल vi कार्यक्रम शामिल नहीं है। इसके बजाय, vi-vi-संगतता मोड में VIM चलाकर vi कमांड प्रदान की जाती है। निम्नलिखित उत्तर अपने vi-संगतता मोड के साथ Vim चलाने पर आधारित है।

केवल-पढ़ने के लिए फ़ाइल को संशोधित करना

यदि वे केवल-पढ़ने के लिए फ़ाइल के बफ़र को संशोधित करते हैं, तो विम उपयोगकर्ता को चेतावनी देता है W10: Warning: Changing a readonly file। उपयोगकर्ता की कोशिश करता इस फ़ाइल के लिए लिख रहे हैं, तो वे, निम्न त्रुटि संदेश मिलता है 'readonly' option is set (add ! to override)

जब मूल निर्देशिका Vim उपयोगकर्ता द्वारा लेखन योग्य है

विम, उपयोगी किया जा रहा है, की सुविधा देता है उपयोगकर्ता पता है कि वे जबरदस्ती एक विस्मयादिबोधक चिह्न जोड़कर, द्वारा लेखन पर जोर देते हैं कर सकते हैं !करने के लिए wआदेश। यदि राइट कमांड के इस जबरदस्त संस्करण का उपयोग किया जाता है, तो Vim मूल फ़ाइल को हटा देता है (यदि Vim का उपयोग केवल Vim-only backupविकल्प सेट के साथ किया जाता है, तो मूल फ़ाइल को वास्तव में बैकअप फ़ाइल के समान ही नाम दिया जाता है)। यह तब मूल नाम के समान नाम वाली एक नई फ़ाइल खोलता है (बनाता है) और इस नई फ़ाइल में इसके बफर की सामग्री को लिखता है। विम चलाने से पहले और बाद में फ़ाइल के इनकोड की जाँच करके इसे देखा जा सकता है :

$ ls -l --inode t

131529 -r--r--r-- 1 anthony anthony 0 Apr 13 09:23 t

$ vi t
$ ls -l --inode t

131649 -r--r--r-- 1 anthony anthony 4 Apr 13 09:23 t

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

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

जब पैरेंट डायरेक्टरी Vim यूजर द्वारा राइट नहीं की जाती है

हालाँकि, इस मामले में भी, विम अभी भी जिज्ञासु उपयोगकर्ता को फ़ाइल को ओवर-राइट करने में मदद करने की पूरी कोशिश करता है। यदि विम उपयोगकर्ता के पास फ़ाइल का स्वामित्व है, तो विम अस्थायी रूप से फ़ाइल की अनुमति को बदलकर ( chmodसिस्टम कॉल का उपयोग करके ) केवल पढ़ने के लिए पेरेंट डायरेक्टरी प्रतिबंध के आसपास प्राप्त कर सकता है, फ़ाइल को बफर लिखना, फ़ाइल को बंद करना और फिर बदलना। अनुमति वापस। यहाँ धारा के माध्यम से vi चलाते समय किए गए सिस्टम कॉल का एक उद्धरण है strace -o ../vi.trace vi t:

getuid()                                = 501
chmod("t", 0100644)                     = 0
open("t", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18)     = 18
fsync(4)                                = 0
close(4)                                = 0
chmod("t", 0100444)                     = 0

नोट: यदि विम उपयोगकर्ता किसी फ़ाइल का संपादन कर रहा है तो ऐसा नहीं होता है क्योंकि उसके पास स्वामित्व नहीं है क्योंकि विम फ़ाइल अनुमतियों को बदलने में सक्षम नहीं होगा।

परिशिष्ट

वास्तव में निश्चित होने के लिए कि किसी फ़ाइल को संशोधित नहीं किया जा सकता (GNU / Linux सिस्टम पर), chattrकमांड को सुपरयुसर के रूप में चलाएं :

sudo chattr +i filename

से man chattr:

'I' विशेषता वाली फ़ाइल को संशोधित नहीं किया जा सकता है: इसे हटाया या नाम बदला नहीं जा सकता है, इस फ़ाइल का कोई लिंक नहीं बनाया जा सकता है और न ही फ़ाइल में कोई डेटा लिखा जा सकता है। केवल CAPUSINUX_IMMUTUT क्षमता वाले सुपरयुजर या एक प्रक्रिया इस विशेषता को सेट या साफ़ कर सकती है।


2
पवित्र धुआं, वह पूरी तरह से था!
केमिली गौडेय्यून

4
@CamilleGoudeseune मेरे उत्तर के पहले संस्करण को पोस्ट करने के बाद, मैंने कुछ प्रयोग किए और स्ट्रेस के माध्यम से विम को चलाने में लगभग एक घंटे का समय लगा। मूल निर्देशिका)। मैं कभी-कभी भाग जाता हूं, लेकिन एक बार मैंने एक उत्तर प्रकाशित कर दिया, तो मैं यह सुनिश्चित करना चाहता था कि जो मैं कह रहा था वह सही था।
एंथोनी जोगेगन

5

अधिकांश सब नहीं करता है, तो viकार्यान्वयन रोक अगर आप या तो की तरह आदेश को बचाने एक नियमित रूप से उपयोग करें फ़ाइल में लिखने का ZZ, :w, :wqया :xके साथ, उदाहरण के लिए vim:

:w
E45: 'readonly' option is set (add ! to override)

दूसरी ओर, यदि आप viफाइल को इसकी अनुमति के बावजूद लिखना पसंद करते हैं, जैसे कि कुछ का उपयोग कर :x!या :wq!, संपादक अस्थायी रूप से फाइल को लिखने की अनुमति देने के लिए अनुमतियों में ढील दे रहा है:

...
stat("test-file", {st_mode=S_IFREG|0444, st_size=7, ...}) = 0
getuid()                                = 1000
chmod("test-file", 0100644)             = 0
...
open("test-file", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 4
write(4, "I am good singer,\n", 18)               = 18
fsync(4)                                = 0
close(4)                                = 0
chmod("test-file", 0100444)             = 0
....

उस स्थिति में, इनोड संख्या अपरिवर्तित रह जाती है।

अंत में, यह एक बग नहीं है क्योंकि यदि आपको फ़ाइल अनुमतियाँ बदलने की अनुमति नहीं है, तो आप इसे संशोधित नहीं कर सकते vi


हा! जब मैंने अपना उत्तर पोस्ट किया, तो मैंने कुछ प्रयोग किए और स्ट्रेस के माध्यम से वीम को चलाने में घंटे के करीब खर्च किया, यह देखने के लिए कि यह अलग-अलग स्थितियों में दृश्यों के पीछे क्या कर रहा है (फाइल और माता-पिता निर्देशिका के अनुमतियों और स्वामित्व के विभिन्न क्रमांकन)। अपने प्रयोगों के परिणामों को संक्षेप में बताने के बाद मैंने केवल आपका उत्तर देखा। यह सीखने का एक अच्छा अनुभव था।
एंथोनी जोगेगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.