फ़ाइल अनुमतियाँ तोड़ सकते हैं?


8

मैं दूसरे दिन हमेशा की तरह विम का इस्तेमाल कर रहा था, जब मुझे कुछ अजीब लगा। यहाँ मैंने क्या किया है:

~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile

फिर मैंने एक बदलाव किया, और बचाया और साथ छोड़ दिया :wq। काफ़ी साधारण। फिर, हालांकि:

~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile

तो रूट में r / w का उपयोग होना चाहिए और बाकी सभी को केवल पढ़ना चाहिए। फ़ाइल संपादित करें, सहेजने का प्रयास करें - आप नहीं कर सकते। बहुत बढ़िया, इरादा के अनुसार काम करना। हालाँकि, यदि आप सहेजते हैं, तो :w!विम किसी तरह फ़ाइल स्वामित्व को वापस उपयोगकर्ता नाम में बदल देता है: उपयोगकर्ता समूह और फ़ाइल सहेज ली जाती है। अगर आप ऐसा करते हैं:

~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile

आप अभी भी साथ अधिलेखित कर सकते हैं :w!! क्या हो रहा है? फ़ाइल स्वामित्व और अनुमति जैसे कानूनों को कैसे तोड़ सकते हैं? मैंने यह कहते हुए विम पेज में मदद की :help :wऔर यह पाया:

:w[rite]! [++opt]    Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
                     Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.

जब मुझे नहीं करना चाहिए तो मैं पहले से ही एक फ़ाइल में लिखने में असमर्थ रहा हूँ, इसलिए मुझे लगता है कि मेरे सवाल का वास्तविक दिल है, मैं कैसे एक फ़ाइल को अनिमित-सक्षम बना सकता हूँ और यह फ़ाइल पर आधारित क्यों नहीं है सिस्टम अनुमतियाँ, जैसे मैं उम्मीद करता हूँ, और वह कौन सा तंत्र है जो फ़ाइल को संपादित करने के लिए उपयोग किया जाता है जिसे अन्य संपादक (gedit, नैनो) उपयोग नहीं कर सकते?

संपादित करें: मैंने जिस कंप्यूटर पर यह कोशिश की थी वह लिनक्स कर्नेल 3.15.5-2-ARCH का उपयोग कर रहा है। विम का संस्करण संख्या 7.4.373-1 है, और इसके द्वारा स्थापित किया गया है pacman- मैंने इसे किसी विशेष विकल्प के साथ खरोंच से संकलित नहीं किया।


मैं समस्या को पुन: उत्पन्न करने में सक्षम नहीं लगता, जब तक कि यहां
अपनाऊं

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

मेरा पहला कूबड़ यह है कि आपको उन निर्देशिकाओं में फ़ाइलों के स्वामित्व को बदलने की अनुमति है जिन्हें आपने लिखा है। लेकिन ऐसा लगता है कि ऐसा नहीं हैCAP_CHOWNकॉल करना आवश्यक है chown(2)। वैसे, मैं डेबियन पर पुन: पेश कर सकता हूं, विम 7.4 के साथ।
बॉब

जवाबों:


10

मैं देख सकता हूं कि आपका वर्तमान पथ ~, आपके उपयोगकर्ता की होम निर्देशिका है। आपको उस डायरेक्टरी के लिए परमिशन लिखना चाहिए।

इसे दूसरे तरीके से सोचें - यदि आपने निर्देशिका को अनुमतियों को पढ़ा और लिखा है, तो आपको फ़ाइल को कॉपी करने, पुराने को हटाने और नए को अलग-अलग अनुमतियों के साथ नया नाम देने से क्या रोक रहा है?

यह वही है जो विम करता है!


यदि आप स्ट्रीम के तहत विम चलाते हैं, उदाहरण के लिए:

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid()                                = 1000
unlink("testfile")                      = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10)             = 10
fsync(3)                                = 0
close(3)                                = 0
chmod("testfile", 0644)                 = 0

इस लॉग के आधार पर, मैं निम्नलिखित प्रक्रिया का अनुमान लगा सकता हूं:

कुछ पहले की अनुमति जांच (और chownप्रयास, आदि) संक्षिप्तता के लिए छोड़ दी जाती है।

  1. open लिखने के लिए फ़ाइल खोलने का प्रयास (विफल: अनुमति अस्वीकृत)
  2. lstat फ़ाइल के मालिक की जाँच करें
  3. getuuid वर्तमान उपयोगकर्ता आईडी की जांच करें, यह देखने के लिए कि क्या वे फ़ाइल के मालिक से मेल खाते हैं
  4. unlink फ़ाइल हटाएं (यह अनुमति है क्योंकि निर्देशिका पर अनुमति लिखें)
  5. open उसी नाम से एक नई फ़ाइल बनाएँ
  6. write फ़ाइल सामग्री (पहले पढ़ी गई, मैंने कुछ जिबरिश में टाइप की)
  7. fsync डिस्क में फ़ाइल को फ्लश करें (वास्तव में महत्वपूर्ण नहीं)
  8. close
  9. chmod पुराने की तरह दिखने के लिए नई फ़ाइल की अनुमतियों को बदलें - यह अभी एक नए मालिक के पास होता है।

ठीक है धन्यवाद। मुझे खुशी है कि मुझे यह पता चला। इसलिए यदि मेरे पास निर्देशिका पर लिखने की अनुमति नहीं है, तो मैं उपयोग नहीं कर पाऊंगा :w!, जो समझ में आता है।
zrneely

इसके अलावा, स्ट्रेस जानकारी वास्तव में आसान है - अब मेरे पास भविष्य में अपनी जांच के लिए एक और उपकरण है।
zrneely

1
@ एक टिप के लिए strace: -oफ़ाइल में आउटपुट लिखने के लिए विकल्प का उपयोग करें ; अन्यथा यह vimआउटपुट के साथ टकराता है । लिखने की अनुमति के लिए, मैं इसे निर्देशिका अनुमतियों की जाँच के साथ नहीं देखता, statलेकिन यह वर्तमान निर्देशिका में फ़ाइल (नाम , यादृच्छिक प्रतीत होता है) बनाने का प्रयास करता है4913 और फिर इसे हटा देता है।
बॉब

ऐसा लगता है 4913कि वास्तव में यह पहला नाम है जो यह कोशिश करता है, और इसका उद्देश्य यह जांचना है कि क्या ऐसा करने के लिए पर्याप्त अनुमति है। देखें: Bugzilla.redhat.com/show_bug.cgi?id=427711#c6 और group.google.com/forum/# ​​.topic
Bob
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.