400 अनुमतियों वाली एक फ़ाइल को मूल रूप से योग्य क्यों देखा जाता है लेकिन केवल उपयोगकर्ता द्वारा पढ़ा जाता है?


10

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

$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro

सब ठीक हैं।

लेकिन फिर रूट साथ आता है:

# [ -w somefile ] && echo rw || echo ro
rw

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

मुझे लगता है कि मैं दोनों को समझना चाहता हूं कि ऐसा क्यों हो रहा है, और किसी फ़ाइल का परीक्षण करते समय मुझे गलत रिटर्न कोड कैसे मिल सकता है जिसमें राइट बिट सेट नहीं है?


btw मैं दोनों RHEL6 ( 4.1.2(1)-release) और RHEL7 ( 4.2.46(2)-release) का उपयोग कर रहा हूँ ।
रिच

16
"बेस्ट प्रैक्टिस यह तय करती है कि मुझे लिखने की अनुमति बिट के लिए परीक्षण करने में सक्षम होना चाहिए, और यदि ऐसा नहीं है, तो यह एक कारण के लिए उस तरह से सेट किया गया था।" - वास्तव में, सबसे अच्छा अभ्यास है "सामान को जड़ के रूप में न चलाएं।" यदि आप रूट के रूप में चल रहे हैं, तो आपने पहले ही अनुमति जांचों को बायपास करने का निर्णय ले लिया है। यूजर्सस्पेस में उन अनुमति जांचों को मैन्युअल रूप से फिर से लागू करना आपदा के लिए एक नुस्खा है
केविन

@ आप के लिए अच्छा है अगर आप बिना पढ़े सामान चला सकते हैं। यह हेरफेर के लिए है /etc/dhcp/dhcpd.conf, जो रूट के स्वामित्व में है। मैं विक्रेता-आपूर्ति का उपयोग कर रहा हूं dhcpd। कुल आपदा, हुह? फ़ाइल को आरसीएस में जांचा जाता है, मैं इसका उपयोग स्वचालित कर रहा हूं rcsdiff, ciऔर coक्योंकि हमारे पास ऐसे ऑपरेटर हैं जिन्हें ... संचालित करने की आवश्यकता है। अनुमति बिट चेक ( -wजैसा कि विस्तृत रूप से test(1)) विफलता की पहली पंक्ति होने जा रही थी, इस आधार पर काम करना कि ci -uएक फ़ाइल केवल-पढ़ने के लिए छोड़ देती है। मैं उसे खाई और सीधे जा रहा हूँ rcsdiff -qऔर जाँच कर रहा हूँ $?। निर्विवाद dhcpd? यह स्वामित्व में होगा dhcpd
रिच

1
यह एक संभावित आपदा है क्योंकि अब आपके पास अनुमतियों की जांच के दो अलग-अलग कार्यान्वयन हैं: एक कर्नेल में और एक यूजरस्पेस में। इससे भी बदतर, उन कार्यान्वयनों का उद्देश्य समान परिणाम उत्पन्न करना भी नहीं है, इसलिए आप उन्हें एक-दूसरे के खिलाफ परीक्षण नहीं कर सकते। इसलिए अब आपके पास पहुंचने के लिए दो रास्ते हैं, जिन्हें एक दूसरे से अलग करके लॉक करना होगा।
केविन

@ केविन ज़रूर, वे समान परिणाम नहीं देते हैं और (मैनपेज़ में विस्तार की कमी के बावजूद) के लिए इरादा नहीं थे, लेकिन मैं स्पष्ट रूप से लेखन-अनुमति बिट की जांच करना चाहता हूं ; और के लिए manpages bashऔर testवो क्या है विश्वास करने के लिए मुझे नेतृत्व [ -wके लिए है।
रिच

जवाबों:


26

test -wउर्फ [ -wफ़ाइल मोड की जाँच नहीं करता है। यह जांचता है कि क्या यह लिखने योग्य है। जड़ के लिए, यह है।

$ help test | grep '\-w'
  -w FILE        True if the file is writable by you.

जिस तरह से मैं परीक्षण करूंगा वह आउटपुट के खिलाफ एक बिटवाइज़ तुलना करना होगा stat(1)(" %a ऑक्टल में एक्सेस अधिकार")।

(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro

ध्यान दें कि उपधारा $(...)को एक 0उपसर्ग की आवश्यकता है ताकि आउटपुट statको ऑक्टल द्वारा व्याख्या किया जाए (( ... ))


संक्षिप्त होने के लिए धन्यवाद। का अच्छा उपयोग (( ... & ... ))। एक टाइपो ने सही किया :-)
रिच

उस 3 को बनाओ ... कोई ifआवश्यक नहीं , अष्टाधारी अनुमति आउटपुट %aनहीं है %d, और अष्टक के उत्पादन की व्याख्या करने के लिए (( ... ))एक उपसर्ग की आवश्यकता है । 0stat
रिच

@ पैट्रिक मेरा man statकहना है "दशमलव में% d डिवाइस नंबर", लेकिन हम जो चाहते हैं वह "एक्सेस अधिकार" हैं, नहीं? 0 उपसर्ग की आवश्यकता के बारे में आपकी बात अच्छी तरह से बनाई गई है, लेकिन मुझे लगता है कि हमें अभी इसे वहां :) में ही बनाना होगा।
sourcejedi

2
stat -c 0%a...
sourcejedi

@sourcejedi ack, आप सही कह रहे हैं। किसी कारण से मैं सोच रहा था कि% d दशमलव में अधिकार था। संपादन बहाल किया। धन्यवाद :-)
पैट्रिक

30

मुझे लगता है कि आपने गलत समझा है कि क्या -wकरता है। यह देखने के लिए जाँच नहीं करता है कि क्या फ़ाइल में "अनुमतियाँ लिखें" हैं, यह देखने के लिए जाँचता है कि क्या फ़ाइल को इनवॉइसिंग उपयोगकर्ता द्वारा लिखने योग्य है ।

विशेष रूप से, यह कॉल access(2)या समान है।

उदाहरण के लिए यदि कोई स्क्रिप्ट है if [ -w /etc/shadow ]तो यदि आप straceस्क्रिप्ट पर चलते हैं तो आप एक रेखा के समान देख सकते हैं

faccessat(AT_FDCWD, "/etc/shadow", W_OK)

चूँकि rootफ़ाइल में लिख सकते हैं तो यह 0 देता है।

एक सामान्य उपयोगकर्ता की तरह:

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)

जड़ के रूप में

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0

यह इस तथ्य के बावजूद कि मेरी मशीन पर /etc/shadowअनुमति है 000

---------- 1 root root 4599 Jan 29 20:08 /etc/shadow

अब आप जो करना चाहते हैं, वह दिलचस्प है और इतना सरल नहीं है।

यदि आप साधारण अनुमतियों की जाँच करना चाहते हैं तो lsआउटपुट, या कॉल statया समान की जाँच करें । लेकिन महसूस करें कि ACL इन अनुमतियों को ओवर-राइड कर सकता है। सिर्फ इसलिए कि एक फ़ाइल की अनुमति है 400 इसे लिखने योग्य होने से नहीं रोकता है ...


नहीं, "गलतफहमी" के लिए गलत तरीके से पठन पढ़ा जाएगा -w: test(1)स्पष्ट है: "फ़ाइल मौजूद है और लिखने की अनुमति दी गई है", " फ़ाइल वर्तमान उपयोगकर्ता द्वारा नहीं लिखी जा सकती है "। ओवरराइडिंग अनुमतियों के बारे में कुछ भी नहीं , न ही एसीएल। bash(1)cagey है: "यह सच है अगर फ़ाइल मौजूद है और लिखने योग्य है ।" ksh(1)shenanigans की ओर एक सूक्ष्म संकेत बनाता है: "-w फ़ाइल // True, यदि फ़ाइल मौजूद है और वर्तमान प्रक्रिया द्वारा लिखने योग्य है ।" zsh(1)defers लिए test(1), zshmisc(1)के रूप में शब्दों में है ksh(1), और zshexpn(1)कुछ दिलचस्प अनुमतियों के आधार पर विवरण ग्लोबिंग। csh(1)प्रफुल्लित करने वाला संक्षिप्त रूप है: "पहुँच लिखें"।

btw: मैंने पैट्रिक के उत्तर को स्वीकार कर लिया, 1. क्योंकि आपने लीड-ऑन प्रश्न का पर्याप्त रूप से उत्तर नहीं दिया था: किसी फ़ाइल का परीक्षण करते समय मुझे एक गलत रिटर्न कोड कैसे मिल सकता है जिसमें राइट बिट सेट नहीं है? और 2. क्योंकि झपकी लेने वाली सीसा में मैंने अनुमानों को गलत समझा।
रिच

3
@ जिस तरह से मैंने इसे पढ़ा है, मुझे लगता है कि आपकी टिप्पणियाँ थोड़ी कर्कशा के रूप में भी आ रही हैं। मैं यह नहीं कह रहा हूं कि आपके द्वारा लिखी गई कोई भी बात गलत थी, बस यह कि अधिक विनम्र तरीके से व्यक्त किए जाने पर यह बेहतर होगा।
डेविड जेड

3
"मुझे लगता है कि आपको गलत समझा है ..." झपकी नहीं है। आपकी प्रतिक्रिया हालांकि, 100% झलकी।
बारबेक्यू

@ इसके अलावा, जबकि मैनपावर क्रिस्टल स्पष्ट नहीं हो सकता है, स्टीफन ने कहा है कि आपके पास "गलत समझा जा सकता है -w क्या करता है ", और न कि क्या manpages कहते हैं, जहां पूर्व मामला दिखता है, इसलिए सवाल
सेबी

1

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

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