LINUX.ORG.RU

Сравнить права в дереве директорий

 ,


0

1

Есть доступ по ssh и 2 сервака. Есть директория и там и там с большим количеством дочерних элементов (файлов и папок). Список в целом одинаковый, но содержимое файлов может меняться. На сервере 2, все права на все директории (любой степени вложенности), выставлены правильно. На сервере 1 могут быть ошибки. Мне нужно убедиться, какие права выставлены на директориях и файлах на всей глубине вложённости, не меняя содержимого. Как это сделать, не заходя в каждую поддиректорию вручную? Будь у меня просто список с деревом и правами, я справился бы за минуты, но проверять всё вручную неохота.

★★★★★

Готовых инструментов не знаю. Из того, что можно написать - рекурсивно получить список всех файлов и прав на них, закинуть в словарь «путь»:«права» или «путь»:«хеш прав» и сравнивать.

anonymous ()

Будь у меня просто список с деревом и правами, я справился бы за минуты, но проверять всё вручную неохота.

А что мешает?

tree -afip

Если цель только привести в соответствие права, то можно не искать самому, а использовать rsync

[/tmp] $ tree -afip serv1 serv2
serv1
[-rw-r--r--]  serv1/1.txt
[drwxr-xr-x]  serv1/dir1
[-rw-r--r--]  serv1/dir1/2.txt
[drwxr-xr-x]  serv1/dir2
[-rw-r--r--]  serv1/dir2/3.txt
[drwxr-xr-x]  serv1/dir3
[-rw-r--r--]  serv1/dir3/4.txt
serv2
[-rwxrwxrwx]  serv2/1.txt
[drwxrwxrwx]  serv2/dir1
[-rwxrwxrwx]  serv2/dir1/2.txt
[drwxrwxrwx]  serv2/dir2
[-rwxrwxrwx]  serv2/dir2/3.txt
[drwxrwxrwx]  serv2/dir3
[-rwxrwxrwx]  serv2/dir3/4.txt
[drwxrwxrwx]  serv2/dir4
[-rwxrwxrwx]  serv2/dir4/5.txt

7 directories, 9 files

[/tmp] $ rsync -a serv1/ serv2/
[/tmp] $ tree -afip serv1 serv2
serv1
[-rw-r--r--]  serv1/1.txt
[drwxr-xr-x]  serv1/dir1
[-rw-r--r--]  serv1/dir1/2.txt
[drwxr-xr-x]  serv1/dir2
[-rw-r--r--]  serv1/dir2/3.txt
[drwxr-xr-x]  serv1/dir3
[-rw-r--r--]  serv1/dir3/4.txt
serv2
[-rw-r--r--]  serv2/1.txt
[drwxr-xr-x]  serv2/dir1
[-rw-r--r--]  serv2/dir1/2.txt
[drwxr-xr-x]  serv2/dir2
[-rw-r--r--]  serv2/dir2/3.txt
[drwxr-xr-x]  serv2/dir3
[-rw-r--r--]  serv2/dir3/4.txt
[drwxrwxrwx]  serv2/dir4
[-rwxrwxrwx]  serv2/dir4/5.txt

7 directories, 9 files
Yorween ()
Ответ на: комментарий от Yorween

tree -afip

о, спасибо. не надо костыль свой делать.

rsync -a serv1/ serv2/

Так оно синхронизирует файлы, а мне нужно только атрибуты (без потери изменений), он вроде и содержимое должен так переписать:

This would recursively transfer all files from the serv1 into theserv2 directory. The files are transferred in «archive» mode, which ensures that symbolic links, devices, attributes, permissions, ownerships, etc. are preserved in the transfer.

fehhner ★★★★★ ()
Последнее исправление: fehhner (всего исправлений: 1)
Ответ на: комментарий от fehhner

А, т. е. у тебя под одному и тому же пути на разных серверах файлы с разным содержимым? Тогда rsync не подойдет. Посмотри на опцию --reference у chown.

[/tmp/dir1] $ tree -afip
[-rw-r--r--]  ./1.txt
[-rwxrwxrwx]  ./2.txt

[/tmp/dir1] $ chmod --reference=1.txt 2.txt
[/tmp/dir1] $ tree -afip
[-rw-r--r--]  ./1.txt
[-rw-r--r--]  ./2.txt

Если названия файлов и порядок в директориях одинаковый, можешь запустить в цикле, взяв значения из tree и передавая их в кач-ве ключа к --reference для файлов из целевой директории.

Yorween ()
Ответ на: комментарий от Yorween

Сразу не подумал, разницу в списках tree покажет обычный diff. Вопрос закрыт, спасибо за помощь.

fehhner ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.