কোনও ব্যবহারকারী কোনও প্রদত্ত ফাইল অ্যাক্সেস করতে পারে কিনা তা কীভাবে পরীক্ষা করবেন?


60

* নিক্স ব্যবহারকারীর অনুমতিগুলি সত্যিই সহজ, তবে যখন কোনও প্রদত্ত ফাইলে পৌঁছানোর আগে আপনাকে সমস্ত অভিভাবক ডিরেক্টরি অ্যাক্সেস অ্যাকাউন্টে নিতে হবে তখন জিনিসগুলি অগোছালো হয়ে যেতে পারে। ব্যবহারকারীর পর্যাপ্ত সুযোগ রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি? যদি তা না হয় তবে কোন ডিরেক্টরিটি অ্যাক্সেস অস্বীকার করছে?

উদাহরণস্বরূপ, ধরুন কোনও ব্যবহারকারী joeএবং ফাইল /long/path/to/file.txt। এমনকি file.txt77 777 এ ছোড করা থাকলেও জো এখনও অ্যাক্সেস করতে সক্ষম হতে হবে /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
জো ফাইলটিতে অ্যাক্সেস করেছে কিনা তা সরাসরি উত্তর দেয় না।
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

sudo -u জো স্ক্রিপ্ট। এখানে স্ক্রিপ্ট ফাইলের নাম ঠিক আছে? সুতরাং আপনার বলছেন sudo জো মত কাজ করতে স্ক্রিপ্ট কল ছিল?
tgkprog

অবিকল। আমি এটি পরিষ্কার করতে আমার উত্তরটি পরিবর্তন করেছি।

আমি নিরঙ্কুশ পাথ পরিচালনা করতে আমার স্ক্রিপ্টে কিছুটা পরিবর্তন করেছি।

@ ইভানটিটেলম্যান একটি নিখুঁত পাথ দিয়ে, আপনি কি pathখালি খালি শুরু করার অর্থ দিয়েছিলেন ? বা /?
গিলস

@ গিলস: আমি এটি খালি থাকার জন্য চাইছিলাম। উদাহরণস্বরূপ, লুপের চারপাশে প্রথমবার pathসেট করা হয়েছে /long, যা সঠিক। আমি কি pathস্পষ্টভাবে কিছুই সেট করা উচিত ( path=)? এছাড়াও, আমার ব্যবহারটি সহজ করার জন্য ধন্যবাদ tr

3

আমি যেমন আপনার প্রশ্ন থেকে পেয়েছি, আপনার এটি বিভিন্ন ব্যবহারকারীর জন্য পরীক্ষা করা উচিত (কেবল জো নয়) তাই সেক্ষেত্রে সবচেয়ে সহজ উপায়টি এটি পুনরায় পুনরুত্পৃষ্টভাবে এটি সুডোর মাধ্যমে পরীক্ষা করা:

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

জো-র ডিরেক্টরিগুলি পড়ার অনুমতি নয়, ডিরেক্টরিগুলিতে অনুমতিগুলি প্রয়োগ করতে হবে।

@ ইভানটিটেলম্যান হ্যাঁ, আপনি ঠিক বলেছেন। সংশোধন করা হয়েছে।
ভিড়ের

/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। আমি কিছু মিস করেছি?
মেটালকোডার

@ মেটালকোডার দুঃখিত, এটি আমার দোষ। একটি অতিরিক্ত উদ্দীপনা ছিল। এটি এখন সরিয়ে ফেলা হয়েছে, আপনি আরও একবার চেষ্টা করতে পারেন, এটি এখন ঠিকঠাক কাজ করা উচিত।
ভিড়ের

@ এটি কাজ! এই অতিরিক্ত উদ্বেগের ফলাফল উপেক্ষা করে -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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.