Як перевірити, чи може користувач отримати доступ до певного файлу?


60

* Дозволи користувача nix дійсно прості, але все може заплутатися, коли вам доведеться врахувати весь доступ до батьківського каталогу, перш ніж дістатися до заданого файлу. Як я можу перевірити, чи є у користувача достатньо привілеїв? Якщо ні, то який каталог забороняє доступ?

Наприклад, припустимо користувача joeта файл /long/path/to/file.txt. Навіть якщо його file.txtбуло дозволено до 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дозволяє дуже легко виявити проблему з дозволом у сценарії.
lorenzog

5
він не відповідає безпосередньо, чи має Джо доступ до файлу.
jfs

15

Ви можете використовувати bash для цього.

$ 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щоб бути порожнім? або /?
Жиль

@Gilles: Я мав на увазі, щоб він був порожнім. У прикладі 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 так, ти маєш рацію. Виправлено.
пік

@rush Я спробував перевірити його з допомогою наступного файлу: /root/test/test.txt (права доступу 0755, 0700і 0777). Я видав, ./script.sh /root/test/test.txt joeі це відлунило original file /root/test/test.txt is readable for joe. Також, намагаючись це, я неправильно ввів тест dir:, ./script.sh /root/tst/test.txt joeі це повторилося original file /root/tst/test.txt is readable for joe. Я щось пропустив?
Metalcoder

@Metalcoder вибачте, це моя вина. Був один зайвий вигук. Він видалений зараз, ви можете спробувати ще раз, він має працювати нормально зараз.
пік

@rush це спрацювало! Це зайве вигук нівелює результат -r $FILE, правда?
Metalcoder

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.