यदि उपयोगकर्ता किसी दिए गए फ़ाइल तक पहुंच सकता है, तो कैसे जांचें?


60

* निक्स उपयोगकर्ता की अनुमति वास्तव में सरल है, लेकिन चीजें गड़बड़ हो सकती हैं जब आपको किसी दिए गए फ़ाइल तक पहुंचने से पहले सभी मूल निर्देशिका का उपयोग करना पड़ता है। यदि उपयोगकर्ता के पास पर्याप्त विशेषाधिकार हैं तो मैं कैसे जांच सकता हूं? यदि नहीं, तो कौन सी निर्देशिका पहुंच से इनकार कर रही है?

उदाहरण के लिए, मान लीजिए कि उपयोगकर्ता joeऔर फ़ाइल /long/path/to/file.txt। यहां तक ​​कि अगर file.txt777 पर chmoded था, तो भी अभी भी जॉय को एक्सेस करने में सक्षम होना चाहिए /long/, /long/path/और फिर /long/path/to/पहले। मुझे जो कुछ भी चाहिए वह स्वचालित रूप से यह जांचने का एक तरीका है। यदि joeपहुंच नहीं है, तो मैं यह भी जानना चाहूंगा कि उसे कहां से मना किया गया है। शायद वह पहुंच सकता है /long/, लेकिन नहीं /long/path/

जवाबों:


71

आप उपयोग कर सकते हैं

namei -m /path/to/really/long/directory/with/file/in

जो एक ऊर्ध्वाधर सूची में पथ के सभी अनुमतियों को आउटपुट करेगा।

या

namei -l /path/to/really/long/directory/with/file/in

सभी स्वामियों और अनुमतियों को सूचीबद्ध करने के लिए


2
यह सही उत्तर होना चाहिए। वास्तव में उपयोग namei <path> || exit 1करने से आप एक स्क्रिप्ट में अनुमति समस्या का आसानी से पता लगा सकते हैं।
लॉरेंजोग

5
यह सीधे जवाब नहीं देता है कि क्या joe के पास फ़ाइल तक पहुंच है।
jfs

15

ऐसा करने के लिए आप बैश का उपयोग कर सकते हैं।

$ cat check-permissions.sh
#!/bin/bash
file=$1
# Handle non-absolute paths
if ! [[ "$file" == /* ]] ; then
    path=.
fi
dirname "$file" | tr '/' $'\n' | while read part ; do
    path="$path/$part"
    # Check for execute permissions
    if ! [[ -x "$path" ]] ; then
        echo "'$path' is blocking access."
    fi
done
if ! [[ -r "$file" ]] ; then
    echo "'$file' is not readable."
fi
$ ./check-permissions.sh /long/path/to/file.txt

किसी विशिष्ट उपयोगकर्ता के लिए इसे जांचने के लिए, आप उपयोग कर सकते हैं sudo

sudo -u joe ./check-permissions.sh /long/path/to/file.txt

सुदो -उ जो लिपि। यहाँ स्क्रिप्ट स्क्रिप्ट फ़ाइल का नाम सही है? तो आपके कहे हुए सूदो को अभिनय करना कैसा लगता है?
tgkprog

यकीनन। मैंने अपना उत्तर स्पष्ट करने के लिए संशोधित किया है।

मैंने गैर-निरपेक्ष रास्तों को संभालने के लिए अपनी स्क्रिप्ट में थोड़ा संशोधन किया।

@EvanTeitelman एक निरपेक्ष पथ के साथ, क्या आपको pathखाली होने के लिए इनिशियलाइज़ करने का मतलब है ? या /?
गाइल्स

@ गिल्स: मेरा मतलब है कि यह खाली होगा। उदाहरण में, लूप के चारों ओर पहली बार pathसेट किया /longगया है, जो सही है। क्या मुझे pathस्पष्ट रूप से कुछ भी निर्धारित नहीं करना चाहिए ( path=)? इसके अलावा, मेरे उपयोग को सरल बनाने के लिए धन्यवाद tr

3

जैसा कि मैंने आपके प्रश्न से प्राप्त किया है, आपको इसे अलग-अलग उपयोगकर्ताओं (न केवल जो) के लिए जांचना चाहिए, इसलिए उस मामले में सबसे आसान तरीका यह है कि इस तरह से sudo के माध्यम से जाँच करें:

FILE=$1 ; T_USER=$2 ;
if sudo -u $T_USER [ -r "$FILE" ] ; then
    echo "original file $1 is readable for $T_USER"
else
    while sudo -u $T_USER [ ! -x "$FILE" ] ; do FILE=$(dirname "$FILE") ; done
    echo "only $FILE is readable for $T_USER"
fi

उपयोग:

./script.sh /long/path/to/file.txt joe

जो निर्देशिकाओं पर अनुमतियों को निष्पादित करता है, पढ़ने की अनुमति नहीं।

@EvanTeitelman हाँ, आप सही हैं। फिक्स्ड।
भीड़

/root/test/test.txt (अनुमतियां हैं: @rush मैं निम्नलिखित फ़ाइल का उपयोग कर यह परीक्षण करने के लिए करने की कोशिश की 0755, 0700और 0777)। मैंने जारी किया ./script.sh /root/test/test.txt joeऔर यह गूँज उठा original file /root/test/test.txt is readable for joe। इसके अलावा, यह प्रयास करते समय मैंने परीक्षण को गलत बताया: ./script.sh /root/tst/test.txt joeऔर यह गूंज उठा original file /root/tst/test.txt is readable for joe। क्या मुझे कुछ याद आया?
मेटलकोडर

@Metalcoder क्षमा करें, यह मेरी गलती है। एक अतिरिक्त छूट थी। अब इसे हटा दिया गया है, आप इसे एक बार आज़मा सकते हैं, इसे अब ठीक काम करना चाहिए।
भीड़

@ आरुष ने काम किया! अतिरिक्त विस्मयादिबोधक के परिणाम को नकारता है -r $FILE, है ना?
मेटलकोडर

1

यहाँ यह कार्यक्षमता प्रदान करने का मेरा प्रयास है। मैंने उपयोग करने का विकल्प चुना है stat, एक whileलूप, और dirname

मैंने यह स्क्रिप्ट बनाई है walkdir.bash:

#/bin/bash

cwd="$1"
while [ "x$cwd" != x/ ]; do
  info=`stat "$cwd" |grep "Access: ("`
  printf "%s : %s\n" "$info" "$cwd"

  cwd=`dirname "$cwd"`;
done

आप इसे ऐसे चलाते हैं:

$ walkdir.bash "/home/saml/blog/vmware_networking_tutorial/url.txt"
Access: (0664/-rw-rw-r--)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial/url.txt
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog/vmware_networking_tutorial
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml/blog
Access: (0700/drwx------)  Uid: (  500/    saml)   Gid: (  501/    saml) : /home/saml
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root) : /home
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.