Vim चोरी की गई स्वामित्व वाली फ़ाइलों को कैसे करता है?


39

निम्नलिखित गवाह:

sh-3.2$ mkdir testcase
sh-3.2$ cd testcase
sh-3.2$ sudo touch temp
sh-3.2$ ls -al
total 0
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 root  staff    0 19 Dec 12:38 temp

sh-3.2$ echo nope > temp
sh: temp: Permission denied

sh-3.2$ vim temp
# inside vim
itheivery
# press [ESC]
:wq!
# vim exits

sh-3.2$ ls -al
total 8
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 glen  staff    7 19 Dec 12:38 temp

किसी तरह विम ने इस रूट-स्वामित्व वाली फ़ाइल को ले लिया है, और इसे एक उपयोगकर्ता के स्वामित्व वाली फ़ाइल में बदल दिया है!

यह केवल तभी काम करता है यदि उपयोगकर्ता निर्देशिका का मालिक है - लेकिन यह अभी भी महसूस करता है कि यह संभव नहीं होना चाहिए। क्या कोई समझा सकता है कि यह कैसे किया जाता है?

जवाबों:


51

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

विम स्वैप फ़ाइलों का उपयोग करता है और पानी के नीचे फ़ाइलों को स्थानांतरित करता है, जिससे यह पता चलता है कि यह उसी फ़ाइल पर लिखना क्यों लगता है जैसे आप अपने शेल में करते हैं, लेकिन यह एक ही बात नहीं है। 2

तो, विम क्या करता है, इसके लिए नीचे आता है:

cat temp > .temp.swp          # copy file by contents into a new glen-owned file
echo nope >> .temp.swp        # or other command to alter the new file
rm temp && mv .temp.swp temp  # move temporary swap file back

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

2 अपडेट: जैसा कि टिप्पणियों में कहा गया है, विम वास्तव में स्वामित्व को बदलने के लिए ऐसा नहीं करता है, क्योंकि tempफ़ाइल पर इनोड नंबर नहीं बदलता है ( ls -liपहले और बाद में आता है)। straceहम का उपयोग करके वास्तव में क्या vimकरता है देख सकते हैं । दिलचस्प हिस्सा यहाँ है:

open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp")                               = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14)              = 14
close(4)                                     = 0
chmod("temp", 0664)                          = 0

यह दिखाता है कि यह केवल अनलिंक करता है, लेकिन फ़ाइल डिस्क्रिप्टर को बंद नहीं करता है temp। यह बल्कि इसकी पूरी सामग्री ( more text bla\nमेरे मामले में) को अधिलेखित करता है । मुझे लगता है कि यह बताता है कि इनोड संख्या क्यों नहीं बदलती है।


3
FWIW आप यह सत्यापित कर सकते हैं कि यह ls -ilपहले और बाद में चल रहा है ... यदि tempइनोड नंबर बदल गया है, तो आप जानते हैं कि यह एक ही नाम के साथ एक अलग फ़ाइल है।
बेकार

3
एक जोड़ सकता है कि आरएम वास्तव में फाइल को नहीं हटाता है, लेकिन सिर्फ फाइल का लिंक हटाता है, और लिंक की संख्या घटने से पहले फाइल डिलीट नहीं होती है। 0. आरएम सिर्फ डायरेक्टरी में फाइल में एंट्री को हटाता है। यदि रूट का किसी अन्य निर्देशिका में फ़ाइल के लिए एक और लिंक (हार्ड लिंक) है, तो उपयोगकर्ता फ़ाइल को हटा नहीं सकता है।
गेरिट

1
@ पता चला कि मैंने कोशिश की, और संख्या नहीं बदली और मालिक और टाइमस्टैम्प बदल गए!
प्रातः

1
@amyassin तुम सही हो! मैंने अपना उत्तर एक स्ट्रेस अंश के साथ अद्यतन करते हुए समझाया है।
gertvdijk

1
विंडोज बनाम यूनिक्स अनुमतियों के बारे में अपने नोट के एक तरफ के रूप में, यदि आप यूनिक्स में विंडोज जैसा व्यवहार चाहते हैं, तो आप रूट द्वारा स्वामित्व वाली निर्देशिका बना सकते हैं (या किसी अन्य उपयोगकर्ता के पास सार्वभौमिक निष्कासन / नाम / आदि अनुमतियाँ होनी चाहिए) और स्टिकी सेट करें निर्देशिका पर सा। तब उपयोगकर्ता केवल अपनी खुद की फ़ाइलों को हटाने में सक्षम होंगे।
मैथ्यू क्रूले

16

पहले:

-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp

बाद:

-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp

अनुमति अवरोध के माध्यम से विम नहीं टूटता है। बस ध्यान से सूचीबद्ध फ़ाइल जानकारी पर एक नज़र है तो आप पता लगा सकते हैं कि वास्तव में विम ने मूल फ़ाइल को हटा दिया है (क्योंकि आपके पास फ़ाइल को निकालने की अनुमति है, हालांकि आप इसकी सामग्री को बदल नहीं सकते हैं) फिर आपकी खुद की एक नई फ़ाइल बनाई ( देखें कि स्वामी अब 'मूल' नहीं है)।

और जब आप मूल फ़ाइल को विम में संपादित कर रहे होते हैं, तो यह चेतावनी देता है कि आप केवल-पढ़ने के लिए फ़ाइल बदल रहे हैं। इसलिए जब आप कमांड टाइप करते हैं :wq!(ऑपरेशन को बल देते हैं), तो केवल वही कर सकते हैं जो मौजूदा फाइल को डिलीट करता है और एक नई फाइल बनाता है जिसमें समान नाम होता है।

उम्मीद है की वो मदद करदे।


1

इनोड संख्या को देखने के -iविकल्प का उपयोग करें ls, जो एक फ़ाइल या अन्य ऑब्जेक्ट की एक विशिष्ट पहचानकर्ता (फाइल सिस्टम के भीतर) है।

आप देखेंगे कि फ़ाइल को एक अलग ऑब्जेक्ट से बदल दिया गया था: इनोड नंबर संभवतः बदल जाएगा।

एक ही इनोड नंबर देखना किसी भी चीज का प्रमाण नहीं है: एक इनोड नंबर को पुनर्नवीनीकरण किया जा सकता है। यदि हम किसी फ़ाइल के अंतिम लिंक को हटाते हैं, और फिर एक नई फ़ाइल बनाते हैं, तो हो सकता है कि हम उसी इनोड नंबर के साथ एक प्राप्त करें। लेकिन ऐसा नहीं हो सकता है यदि नया बनाने के बाद पुरानी फाइल को हटा दिया जाए। जैसे mv file file.tmp; touch file; rm file.tmp। मुझे संदेह है कि विम वास्तव में इसके अनुरूप कुछ करता है echo new_content > tmpfile; mv tmpfile filemvआपरेशन एक करने के लिए अनुवाद करेगा renameसिस्टम कॉल, इसलिए आईनोड संख्या के काम एक नाम बदलने जो एक गंतव्य अनलिंक कैसे फाइल सिस्टम लागू पर निर्भर करता है।

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