क्या कोई ऐसी फ़ाइल है जो हमेशा मौजूद रहती है और एक 'सामान्य' उपयोगकर्ता इसे नहीं खोल सकता है?


14

मुझे एक इकाई परीक्षण के लिए इसकी आवश्यकता है। एक फ़ंक्शन है जो फ़ाइल पैरामीटर पर lstat करता है जो इसके पैरामीटर के रूप में पारित हुआ है। मुझे कोड पथ को ट्रिगर करना होगा जहांlstat विफल रहता है (क्योंकि कोड कवरेज 90% तक पहुंच गया है)

परीक्षण केवल एक ही उपयोगकर्ता के तहत चल सकता है, इसलिए मैं सोच रहा था कि क्या उबंटू में एक फ़ाइल है जो हमेशा मौजूद रहती है, लेकिन सामान्य उपयोगकर्ताओं के पास या उसके फ़ोल्डर तक कोई रीड एक्सेस नहीं है। (इसलिएlstat जब तक इसे रूट के रूप में निष्पादित नहीं किया जाएगा, तब तक यह विफल रहेगा।)

एक गैर-मौजूद फ़ाइल एक समाधान नहीं है, क्योंकि इसके लिए एक अलग कोड पथ है, जिसे मैं पहले से ही ट्रिगर कर रहा हूं।

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



3
आप किसी भी फ़ाइल के अस्तित्व को नहीं मान सकते हैं, क्योंकि आपका प्रोग्राम चेरोट या अलग नामस्थान में चल सकता है। यदि यह मान लिया जाए कि / proc मुहिम शुरू की गई है तो ठीक है और init कुछ खास नहीं है, तो /proc/1/fd/0करना चाहिए।
मॉसवी

1
@mosvy धन्यवाद जो मेरे स्थानीय मशीन पर काम करता है। हम्म तो मैं इसे क्यूए और स्टेजिंग पूल पर भी कोशिश करूँगा।
बिल्ली का बच्चा बिल्ली का बच्चा

2
आप अपने परीक्षण कोड को OS के किसी विशेष स्वाद के लिए क्यों बांध रहे हैं जब आप सिर्फ एक थकाऊ फ़ाइल बना सकते हैं और अपनी खुद की पढ़ी गई पहुंच को निकाल सकते हैं?
किलन फ़ॉथ

4
मैं तर्क दूंगा कि यह वास्तव में एक यूनिट टेस्ट नहीं है, क्योंकि यह एक वास्तविक पर निर्भर करता है, बजाय मॉकडिज किए, फाइलसिस्टम के।
टोबे स्पीट

जवाबों:


21

आधुनिक लिनक्स सिस्टम पर, आपको /proc/1/fdinfo/0आईडी 1 की प्रक्रिया में फ़ाइल डिस्क्रिप्टर 1 (स्टडआउट के लिए जानकारी) का उपयोग करने में सक्षम होना चाहिए ( initरूट पीड नेमस्पेस जो कि जैसा होना चाहिए root)।

आप (सामान्य उपयोगकर्ता के रूप में) के साथ एक सूची पा सकते हैं:

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

(निकालें -type fयदि आप नियमित फ़ाइलों को प्रतिबंधित नहीं करना चाहते हैं)।

/var/cache/ldconfig/aux-cacheएक और संभावित उम्मीदवार है, अगर आपको केवल उबंटू सिस्टम पर विचार करने की आवश्यकता है। यह अधिकांश GNU सिस्टम पर काम करना चाहिए, क्योंकि GNU libc के साथ आने वाली कमांड /var/cache/ldconfigद्वारा केवल पढ़ने के लिए + लिखने + खोजने योग्य बनाया जाता है ldconfig


1
धन्यवाद! यदि /proc/1/fdinfo/0उबंटू 16.04 और 18.04 पर काम करता है, तो यह पर्याप्त से अधिक है।
क्राउचिंग बिल्ली का बच्चा

1
का उपयोग करना /proc/1/fdinfo/0जरूरी नहीं कि कंटेनर में काम करता है (जैसे, एक डॉक कंटेनर), और अक्सर सीआई में ऐसे कंटेनरों में इकाई परीक्षण चलाए जाते हैं।
फिलिप वेंडलर

@PhilippWendler, मैंने रूट पीड नेमस्पेस का उल्लेख पहले ही कर दिया था। ओपी कंटेनरों के बारे में नहीं पूछ रहा है, लेकिन उबंटू सिस्टम के फाइल सिस्टम लेआउट में होने की गारंटी वाली फाइलों के बारे में। चूंकि कंटेनरों में कोई फ़ाइल और निर्देशिका लेआउट हो सकता है, इसलिए यह प्रश्न वहां जवाबदेह नहीं हो सकता है।
स्टीफन चेज़लस

12

Lstat को देखते हुए (2) आदमी पेज आप मामलों है कि यह ENOENT के अलावा अन्य त्रुटियों के साथ असफल हो सकता है पर कुछ प्रेरणा प्राप्त कर सकते हैं (फ़ाइल मौजूद नहीं है।)

सबसे स्पष्ट एक है:

EACCES खोज अनुमति पथ के उपसर्ग में निर्देशिकाओं में से किसी एक के लिए अस्वीकृत है

इसलिए आपको एक निर्देशिका की आवश्यकता है जिसे आप खोज नहीं सकते हैं।

हां, आप अपने सिस्टम में पहले से मौजूद एक चीज़ की तलाश कर सकते हैं (शायद /var/lib/privateअगर यह मौजूद है?) लेकिन आप समान के साथ खुद को भी बना सकते हैं:

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

यहाँ LACAT (2) ऑपरेशन EACCES से विफल हो जाएगा। (निर्देशिका से सभी अनुमतियों को हटाने से यह सुनिश्चित हो जाता है। हो सकता है कि आपको इसकी आवश्यकता भी न हो औरchmod -x निष्पादन अनुमतियों को हटाना पर्याप्त होगा, क्योंकि इसके तहत फ़ाइलों तक पहुंचने के लिए किसी निर्देशिका पर अनुमतियों को निष्पादित करना आवश्यक है।)

Lstat (2) को विफल करने का एक और रचनात्मक तरीका है, इसके मैन पेज को देखना:

ENOTDIR के पथ का प्रारंभिक भाग के एक घटक पथ एक निर्देशिका नहीं है।

तो, जैसे कि एक फ़ाइल का उपयोग करने की कोशिश कर रहा है /etc/passwd/nonexistent इस तरह की त्रुटि को ट्रिगर करना चाहिए, जो फिर से ENOENT ("ऐसी कोई फ़ाइल या निर्देशिका नहीं") से अलग है और आपकी आवश्यकताओं के अनुरूप हो सकता है।

एक और है:

ENAMETOOLONG का रास्ता बहुत लंबा है।

लेकिन आपको इस एक के लिए वास्तव में लंबे नाम की आवश्यकता हो सकती है (मेरा मानना ​​है कि 4,096 बाइट्स विशिष्ट सीमा है, लेकिन आपके सिस्टम / फाइल सिस्टम में एक लंबा समय हो सकता है।)

अंत में, यह बताना मुश्किल है कि इनमें से कोई भी वास्तव में आपके लिए उपयोगी होगा । आप कहते हैं कि आप ऐसा कुछ चाहते हैं जो "फ़ाइल मौजूद नहीं है" परिदृश्य को ट्रिगर न करे। जबकि आमतौर पर इसका मतलब है कि एक त्रुटि, व्यवहार में कई उच्च-स्तरीय जाँचें केवल lstat (2) से किसी भी त्रुटि की व्याख्या करेंगी क्योंकि "मौजूद नहीं है"। उदाहरण के लिए test -eया [ -e ...]शेल से समतुल्य बस उपरोक्त सभी की व्याख्या "अस्तित्व में नहीं है" के रूप में हो सकती है, खासकर जब से यह एक अलग त्रुटि संदेश वापस करने का एक अच्छा तरीका नहीं है और एक त्रुटि नहीं लौटने से फ़ाइल मौजूद होगी। जो निश्चित रूप से ऐसा नहीं है।


@StephaneChazelas महान बिंदु! अपडेट किया गया।
filbranden

6

आप findइसे स्वयं कर सकते हैं।

का उपयोग कर /etc- एक प्रारंभिक बिंदु के रूप में विन्यास फाइल निर्देशिका:

sudo find /etc -type f -perm 0400 -user root

मेरे सिस्टम पर, यह कुछ भी वापस नहीं करता है।

आप एक कम प्रतिबंधक हो सकते हैं और समूह की अनुमति दे सकते हैं root(केवल उपयोगकर्ता rootको समूह का सदस्य होना चाहिए root), और इसकी अनुमति के लिए एक नज़र डालें 440:

sudo find /etc -perm 0440 -user root -group root

मेरे सिस्टम पर यह रिटर्न:

/etc/sudoers.d/README
/etc/sudoers

संपादित करें:

अपने संपादन के आधार पर, आप एक ऐसी निर्देशिका की तलाश कर रहे हैं, जिसमें उपयोगकर्ता के लिए निर्देशिका सूची को रोकने के लिए पर्याप्त अनुमति न हो:

sudo find / -perm o-rwx -type d -user root -group root 

यहां मैं उन निर्देशिकाओं ( -type d) की तलाश कर रहा हूं, जिनमें दूसरों के लिए पढ़ने-लिखने-निष्पादित करने की अनुमति बिट्स की कमी है ( o-rwx) और उनका स्वामित्व है root:root

तकनीकी रूप से, निष्पादन की अनुपस्थिति ( x) बिट निर्देशिका lstat(2)पर निर्देशिका लिस्टिंग ( ) को रोक सकती है ।

आउटपुट में मैंने /run/systemd/inaccessible/अपने सिस्टमड इनिट आधारित सिस्टम पर पाया है।

में फ़ाइलों के बारे में /proc, /sys, /dev:

  • ये फाइलसिस्टम वर्चुअल एफएस हैं यानी ये डिस्क पर नहीं बल्कि मेमोरी पर रहते हैं

  • यदि आप पर भरोसा करने की योजना बनाते हैं /proc, तो /proc/1/पीआईडी ​​1 के तहत किसी चीज़ पर भरोसा करें, पर भरोसा करें। बाद में पीआईडी ​​में विश्वसनीयता / स्थिरता नहीं है क्योंकि बाद में पीआईडी ​​(प्रक्रिया) मौजूद होने की गारंटी नहीं है।


धन्यवाद, मुझे लगता है कि मेरा प्रश्न गलत है। मैं अभी भी उन्हें पढ़ने के लिए उपयोग के बिना फ़ाइलें lstat कर सकते हैं। हो सकता है कि फ़ोल्डर तक पहुंच सीमित होनी चाहिए? (मैंने शीर्षक को संशोधित किया)
क्रिचिंग बिल्ली का बच्चा

धन्यवाद। साथ find / -type d -perm 0400 -user rootमैं निर्देशिका पाया है /proc/20/map_files/, अगर मैं उस फ़ोल्डर के अंदर एक बना-अप फ़ाइल नाम का उल्लेख है, जैसे /proc/20/map_files/asdasd, तो यह हमेशा विफल रहता है। क्या वह फ़ोल्डर हमेशा उबंटू पर मौजूद होता है?
क्राउचिंग बिल्ली का बच्चा

@CrouchingKitten, निर्देशिका /proc/1/सुरक्षित हो सकता है, क्योंकि यह हमेशा मौजूद है। लेकिन procयह एक नियमित फाइल सिस्टम नहीं है, अगर यह मायने रखता है।
ilkachachu

धन्यवाद मैंने एक उत्थान दिया, लेकिन दूसरे उत्तर को स्वीकार कर लिया, क्योंकि उन्होंने कहा कि यह गारंटी है कि /proc/1/fdinfo/0आधुनिक उबंटू पर काम करता है।
क्राउचिंग बिल्ली का बच्चा

-perm o-rwxकी तरह है -perm 0, बिट्स के साथ शुरू करने के लिए सभी बंद हैं। यहाँ, आप चाहते हैं ! -perm -1
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.