Як рекурсивно перевіряти дозволи в зворотному порядку?


25

Є команда, я думаю, вона поставляється з apache, або якимось чином пов’язана з нею, яка перевіряє дозволи, аж донизу. Так що, якщо у мене /home/foo/bar/bazбуде сказати мені , що дозволу є для baz, bar, fooі home. Хтось знає, що це за команда чи інший спосіб її виконання? Команда в основному починається з аргументу, і працює так, щоб /повідомити про те, які дозволи є на цьому шляху, щоб ви могли побачити, чи є у вас проблема з дозволом.

Відповіді:


28

Утиліта, про яку ви можете думати, - це nameiкоманда. Відповідно до сторінки керівництва:

Namei використовує свої аргументи як назви шляхів до будь-якого типу файлу Unix (символьні посилання, файли, каталоги тощо). Потім Namei слід за кожним ім'ям шляху, поки не буде знайдена кінцева точка (файл, каталог, пристрій char тощо). Якщо він знаходить символічне посилання, ми показуємо посилання та починаємо слідувати за ним, відступаючи висновку, щоб показати контекст.

Вихід, який Ви бажаєте, може бути отриманий наступним чином:

$ 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

nameiКоманда є частиною Linux-Util-нг програмного пакета. Детальнішу інформацію див . На сторінці керівництва .


це може бути, здається, це робиться лише для посилань, хоча я не пам’ятаю, що я використовував і чи було це на посилання.
ксенотеррацид

Хоча я бачив старі сторінки з інструкціями, на яких згадуються лише посилання, як показує мій приклад та сторінка man, вони містять слова для всіх типів файлів та каталогів.
Стівен Д

не для мене :( це довго дає такий перелік, як для мене, із посиланнями.
xenoterracide

яку версію ви використовуєте? Я використовую 2.18
ксенотерацид

2
ще один корисний спосіб використання імені для тих, хто лінивий. namei -l $PWD/public_html/З вашого поточного dir нам $ PWD, щоб отримати список пермісів до вашого поточного dir.
nelaaro

7

Я не знаю жодних команд, але написати сценарій досить просто:

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

Приклад:

$ 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

2

Як щодо рекурсивної функції баш для веселого рішення:

[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#] 

Це мій фаворит, тому що він не потребує залежностей. Можливо, хочете зробити це cd .. >/dev/nullхоча б для тих, хто з нас із $CDPATHнабором (що призводить до того, що CD виводить поточний dir при його використанні, і це заважає виводу з вашої функції.)
beporter

2

Я думаю, що команда, яку ти шукаєш, це:

namei -l `pwd`

який, виконуючись у / tmp / foo / bar, дає вам такий список:

drwxr-xr-x root   root   /
drwxrwxrwt root   root   tmp
drwxr-xr-x user   group  foo
drwxr-xr-x user   group  bar

1

Це можна було легко зробити однолінійним. Це не є рекурсивним, і це має бути відносно швидким способом робити це в башті. Виклик pwd у кожному циклі не особливо швидкий, тому уникайте, якщо можете.

#!/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

Альтернативно, однолінійний файл для поточного каталогу.

(IFS="/"; set -f; for dir in $PWD; do stat -c "$PWD %A" .; cd ..; done)

Це однолінійний? Я щось пропустив?
phunehehe

Як єдиний вкладиш для pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; IFS = "/"; за dir в $ (pwd); зробіть stat -c "$ (pwd)% A"; cd ..; зроблено; IFS = $ OIFS; popd> / dev / null
ewindisch

Ваш сценарій не працюватиме з іменами файлів, що містять пробіли або символи, що вказують глобус.
Жил "ТАК - перестань бути злим"

Жил, я думаю, ні. Спочатку це було, але я придушив це в редагуванні. Я видалив xargs, і він повинен працювати належним чином знову.
ewindisch

Навіщо використовувати pushd та popd? Або eval, з цього приводу? Ви можете скористатися підзаголовком (круглими дужками), щоб зберегти всі зміни локальними. Вам потрібні подвійні лапки, щоб захистити імена каталогів пробілами та set -fвимкнути глобалізацію. cd -Pдотримується всіх посилань.
Жил "ТАК - перестань бути злим"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.