Как рекурсивно проверить разрешения в обратном порядке?

25

Есть команда, я думаю, она поставляется с Apache или как-то связана с ней, которая проверяет права доступа вплоть до самого конца. Так что, если у меня /home/foo/bar/bazбудет сказать мне , что разрешения являются для baz, bar, fooи home. Кто-нибудь знает, что это за команда или как это сделать? Команда в основном начинается с аргумента и работает так, чтобы /дать вам знать, какие у вас есть разрешения, чтобы вы могли увидеть, есть ли у вас проблемы с разрешениями.

xenoterracide
источник

Ответы:

28

Утилита, о которой вы можете подумать, - это nameiкоманда. Согласно странице руководства:

Namei использует свои аргументы в качестве путей к любому типу файлов Unix (символические ссылки, файлы, каталоги и т. Д.). Затем Namei следует за каждым путем до тех пор, пока не будет найдена конечная точка (файл, каталог, символьное устройство и т. Д.). Если он находит символическую ссылку, мы показываем ссылку и начинаем переходить по ней, делая отступ для вывода контекста.

Результат, который вы хотите получить, может быть получен следующим образом:

$ 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-ng . Смотрите страницу руководства для более подробной информации.

Стивен Д
источник
может быть, кажется, он делает это только для символических ссылок, хотя я не помню, что я использовал и было ли это по символической ссылке.
ксенотеррацид
Хотя я видел старые справочные страницы, в которых упоминались только символические ссылки, как показывает мой пример и справочная страница, это слова для всех типов файлов и каталогов.
Стивен Д.
не для меня :( это долго дает длинный список, как это, для меня, с символическими
ссылками
Какую версию ты используешь? Я использую 2.18
ксенотеррацид
2
Еще один полезный способ использовать namei для тех, кто ленив. namei -l $PWD/public_html/Из вашего текущего каталога нам $ PWD, чтобы получить список разрешений до вашего текущего каталога.
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 для забавного решения:

[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
источник
Это мой любимый, потому что не требует никаких зависимостей. cd .. >/dev/null$CDPATH
Возможно, стоит
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

Это может быть легко сделано в одну строку. Это не является рекурсивным и должно быть относительно быстрым способом сделать это в bash. Вызов 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)
ewindisch
источник
Это однострочник? Я что-то пропустил?
phunehehe
Как однострочник для pwd: pushd $ (pwd)> / dev / null; OIFS = $ IFS; КСФ = "/"; для dir в $ (pwd); do stat -c "$ (pwd)% A".; CD ..; сделанный; IFS = $ OIFS; popd> / dev / null
ewindisch
Ваш скрипт не будет работать с именами файлов, содержащими пробелы или символы-заглушки.
Жиль "ТАК - перестань быть злым"
Жиль, наверное нет. Первоначально, но я все испортил при редактировании. Я удалил xargs, и он снова должен работать правильно.
ewindisch
Зачем использовать pushd и popd? Или Eval, в этом отношении? Вы можете использовать подоболочку (круглые скобки), чтобы сохранить все изменения локальными. Вам нужны двойные кавычки, чтобы защитить имена каталогов с пробелами и set -fотключить глобализацию. cd -Pследует за всеми символическими ссылками.
Жиль "ТАК - перестань быть злым"
1

альтернативно, рассмотрите возможность использования findсtac

find /path -printf '%M %u %g %p\n' | tac
Лука Филипоцци
источник