Jak sprawdzić, czy użytkownik może uzyskać dostęp do danego pliku?


60

* Uprawnienia użytkownika nix są bardzo proste, ale sprawy mogą się popsuć, gdy trzeba wziąć pod uwagę dostęp do katalogu nadrzędnego przed dotarciem do danego pliku. Jak mogę sprawdzić, czy użytkownik ma wystarczające uprawnienia? Jeśli nie, to który katalog odmawia dostępu?

Załóżmy na przykład użytkownika joei plik /long/path/to/file.txt. Nawet jeśli file.txtzostał chmoded do 777, Joe nadal musi mieć dostęp /long/, /long/path/a potem /long/path/to/jeszcze raz. Potrzebuję sposobu, aby to automatycznie sprawdzić. Jeśli joenie ma dostępu, chciałbym również wiedzieć, gdzie mu odmówiono. Może ma dostęp /long/, ale nie /long/path/.

Odpowiedzi:


71

Możesz użyć

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

która wyświetli wszystkie uprawnienia na ścieżce na liście pionowej.

lub

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

aby wyświetlić listę wszystkich właścicieli i uprawnień


2
To powinna być właściwa odpowiedź. W rzeczywistości używanie namei <path> || exit 1pozwala na łatwe wykrycie problemu z uprawnieniami w skrypcie.
lorenzog

5
nie odpowiada bezpośrednio, czy Joe ma dostęp do pliku.
jfs,

15

Możesz użyć bash, aby to zrobić.

$ 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

Aby to sprawdzić dla konkretnego użytkownika, możesz użyć sudo.

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

skrypt sudo -u joe. Tutaj skrypt to nazwa pliku skryptu, prawda? więc mówienie sudo, żeby zachowywał się, jakby Joe wołał skrypt?
tgkprog

Dokładnie. Zmodyfikowałem swoją odpowiedź, aby to wyjaśnić.

Wprowadziłem niewielką modyfikację mojego skryptu, aby obsługiwał ścieżki nie-absolutne.

@EvanTeitelman Czy z absolutną ścieżką chciałeś zainicjować, pathaby być pustym? czy /?
Gilles

@Gilles: Chciałem, żeby było puste. W tym przykładzie pathustawiono /longpo raz pierwszy wokół pętli, co jest poprawne. Czy powinienem ustawić pathjawnie na nic ( path=)? Dziękuję również za uproszczenie mojego korzystania z tr.

3

Jak otrzymałem z twojego pytania, powinieneś to sprawdzić dla różnych użytkowników (nie tylko Joe), więc w takim przypadku najłatwiej jest to sprawdzić rekurencyjnie za pomocą sudo w następujący sposób:

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

stosowanie:

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

Joe potrzebuje uprawnień do wykonywania katalogów, a nie uprawnień do odczytu.

@EvanTeitelman tak, masz rację. Naprawiony.
pędzi

@rush starałem się przetestować go stosując następujący plik: /root/test/test.txt (uprawnienia są 0755, 0700i 0777). Wydałem ./script.sh /root/test/test.txt joei echo original file /root/test/test.txt is readable for joe. Ponadto, próbując tego, źle wpisałem test reż: ./script.sh /root/tst/test.txt joei echo original file /root/tst/test.txt is readable for joe. Coś przeoczyłem?
Metalcoder

@Metalcoder przepraszam, to moja wina. Był jeszcze jeden okrzyk. Teraz jest usunięty, możesz wypróbować go jeszcze raz, teraz powinien działać dobrze.
pędzi

@ Rush to działało! Ten dodatkowy wykrzyknik neguje wynik -r $FILE, prawda?
Metalcoder

1

Oto moja próba zapewnienia tej funkcjonalności. Ja zdecydowaliśmy się użyć stat, a whilepętlę, i dirname.

Stworzyłem ten skrypt 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

Uruchamiasz to tak:

$ 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.