Jak rekurencyjnie sprawdzać uprawnienia w odwrotnej kolejności?

25

Wydaje mi się, że jest polecenie, które pochodzi z apache lub jest z nim w jakiś sposób powiązane, które sprawdza uprawnienia aż do samego końca. Więc jeśli mam /home/foo/bar/bazto powiedz mi, co to za uprawnienia baz, bar, foo, i home. Czy ktoś wie, co to polecenie lub w inny sposób? Komenda zasadniczo zaczyna się od argumentu i działa tak, aby /poinformować cię, jakie uprawnienia są po drodze, abyś mógł sprawdzić, czy masz problem z uprawnieniami.

ksenoterracid
źródło

Odpowiedzi:

28

Narzędzie, o którym możesz myśleć, to nameipolecenie. Według strony podręcznika:

Namei używa swoich argumentów jako nazw ścieżek do dowolnego rodzaju plików uniksowych (dowiązania symboliczne, pliki, katalogi itd.). Namei podąża następnie za każdą ścieżką, aż do znalezienia punktu końcowego (pliku, katalogu, urządzenia char itp.). Jeśli znajdzie link symboliczny, pokazujemy link i zaczynamy go śledzić, wciskając dane wyjściowe, aby pokazać kontekst.

Żądane dane wyjściowe można otrzymać w następujący sposób:

$ namei -l /usr/src/linux-headers-2.6.35-22/include/
f: /usr/src/linux-headers-2.6.35-22/include/
drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxrwsr-x root src  src
drwxr-xr-x root root linux-headers-2.6.35-22
drwxr-xr-x root root include

nameiKomenda jest częścią linux-util-NG pakietu oprogramowania. Więcej informacji znajduje się na stronie podręcznika .

Steven D.
źródło
może tak być, wygląda na to, że robi to tylko dla dowiązań symbolicznych, chociaż nie pamiętam, czego używałem i czy było to na dowiązaniu symbolicznym.
ksenoterrakid
Podczas gdy widziałem starsze strony podręcznika, w których wymieniono tylko dowiązania symboliczne, zarówno mój przykład, jak i strona podręcznika man, to słowa dla wszystkich typów plików i katalogów.
Steven D
nie dla mnie :( to długo daje taką długą listę, dla mnie, z dowiązaniami symbolicznymi.
xenoterracide
Jakiej wersji używasz? Używam 2.18
Xenoterracide
2
kolejny użyteczny sposób używania namei dla leniwych. namei -l $PWD/public_html/Z aktualnego reż. US $ PWD, aby uzyskać listę perms do aktualnego reż.
nelaaro
7

Nie znam żadnych poleceń, ale napisanie skryptu jest dość łatwe:

#!/bin/bash    
ARG=$1
while [[ "$ARG" != "." && "$ARG" != "/" ]]
do
        ls -ld -- "$ARG"
        ARG=`dirname -- "$ARG"`      
done

Przykład:

$ perms.sh /tmp/1/2/3/hello.txt

-rw-rw-r--    1 user    group          0 Jan 14 16:59 /tmp/1/2/3/hello.txt
drwxrwxr-x    2 user    group       4096 Jan 14 16:59 /tmp/1/2/3
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1/2
drwxrwxr-x    3 user    group       4096 Jan 14 16:43 /tmp/1
drwxrwxrwt   12 root     root       4096 Jan 14 17:02 /tmp
dogbane
źródło
2

Co powiesz na funkcję rekurencyjnej bash dla przyjemnego rozwiązania:

[bash#] function uptree { ( \ls -ld -- "$PWD"; [ "$PWD" = '/' ] && return; cd ..; uptree ) | column -t ; } 

[bash#] pwd
/home/frielp/bin/dev

[bash#] uptree
drwxrwxr-x.  2   frielp  frielp  4096  Dec  14  14:50  /home/frielp/bin/dev
drwxr-xr-x.  15  frielp  frielp  4096  Aug  23  10:48  /home/frielp/bin
drwxr-xr-x.  60  frielp  frielp  4096  Jan  14  16:48  /home/frielp
drwxr-xr-x.  4   root    root    4096  Dec  1   09:14  /home
dr-xr-xr-x.  23  root    root    4096  Jan  14  08:18  /

[bash#] pwd
/home/frielp/bin/dev
[bash#] 
frielp
źródło
To mój ulubiony, ponieważ nie wymaga żadnych zależności. Być może zechce to zrobić cd .. >/dev/nulldla tych z nas, którzy mają $CDPATHzestaw (co powoduje, że cd
wypisuje bieżący katalog,
2

Myślę, że polecenie, którego szukasz, to:

namei -l `pwd`

który, gdy jest wykonywany w / tmp / foo / bar, daje ci taką listę jak:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar
chrześcijanin
źródło
1

Można to łatwo zrobić z jednej linii. Nie jest to rekurencyjne i powinno być względnie szybkim sposobem na zrobienie tego w bashu. Wywołanie pwd w każdej pętli nie jest szczególnie szybkie, więc unikaj, jeśli możesz.

#!/bin/bash
if [ -n "$1" ]; then
    echo "Usage: $0 [FILE]"
    exit 1
fi
cd -P -- "$1"
IFS="/"
set -f # turn off globbing for the expansion of $PWD below
for dir in $PWD; do
    stat -c "$PWD %A" .
    cd ..
done

Alternatywnie, jeden wiersz dla bieżącego katalogu.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)
ewindisch
źródło
Czy to jest jedna linijka? Przegapiłem coś?
phunehehe 15.01.11
Jako jednowierszowy dla pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; za reż. w $ (pwd); do stat -c "$ (pwd)% A".; Płyta CD ..; gotowy; IFS = $ OIFS; popd> / dev / null
ewindisch 15.01.11
Twój skrypt nie będzie działał z nazwami plików zawierającymi spacje lub znaki globowania.
Gilles „SO- przestań być zły”,
Gilles, chyba nie. Początkowo tak, ale zmarnowałem to podczas edycji. Usunąłem xargs i powinien znowu działać poprawnie.
ewindisch
Dlaczego warto korzystać z pushd i popd? A może ewaluacja? Możesz użyć podpowłoki (nawiasów), aby wszystkie zmiany były lokalne. Potrzebujesz podwójnych cudzysłowów, aby zabezpieczyć nazwy katalogów spacjami i set -fwyłączyć globowanie. cd -Pśledzi wszystkie dowiązania symboliczne.
Gilles „SO- przestań być zły”
1

alternatywnie rozważ użycie findztac

find /path -printf '%M %u %g %p\n' | tac
Luca Filipozzi
źródło