Я хотел бы проверить групповые разрешения файла из bash-скрипта. В частности, мне нужно проверить, есть ли в файле бит записи группы.
Вот и все. Просто как тот. Однако:
- Мне также нужно, чтобы это было портативно.
test -w <file
не скажет мне, можно ли записать группу- Вывод
ls -ld
полезен для людей, но не уверен в сценариях. Технически я мог бы разобрать вывод, например,drwxrwxr-x
чтобы извлечь групповые биты, но это кажется хрупким. - Интерфейс для
stat
полностью несовместим между OS X и другими системами. find <file> -perm ...
не может быть ответом?
bash
permissions
ls
stat
mislav
источник
источник
Ответы:
Метод № 1 - стат
Вы можете использовать
stat
команду, чтобы получить биты прав доступа.stat
доступно в большинстве Unixes (OSX, BSD, а не AIX из того, что я могу найти). Это должно работать на большинстве Unixes, кроме OSX и BSD из того, что я могу найти.пример
Используйте эту команду:
И используйте простой,
grep
чтобы увидеть, является ли режим разрешений групп 6 или 7.Для OSX и BSD вы должны использовать эту форму
stat
,stat -f
(или , возможноstat -x
), и разобрать соответственно. Поскольку параметрыstat
отличаются, вы можете заключить эту команду вlsb_release -a
команду и вызвать соответствующую версию в зависимости от ОС. Не идеально, но выполнимо. Поймите, чтоlsb_release
это доступно только для дистрибутивов Linux, поэтому нужно будет найти другую альтернативу для тестирования других ОС Unix.Метод № 2 - найти
Я думаю, что эта команда может служить вам лучше, хотя. Я использую
find
иprintf
выключатель.пример
Метод № 3 - Perl
Perl может быть более переносимым способом сделать это в зависимости от ОС, которую вы пытаетесь охватить.
ПРИМЕЧАНИЕ . Вышеприведенное использует
stat()
функцию Perl для запроса битов файловой системы.Вы можете сделать это более компактным, отказавшись от использования массива
@pv
иstat()
непосредственно работая с выводом :источник
stat
сильно различается в разных системах и не переносима.find . -printf
могу сделать это, но не могу определить, доступно ли это на OSX 'найти.Одним из вариантов является использование
perl
, которое будет портативным везде, гдеperl
доступно. Трудно найти систему Unix без нее. Вот пример того, как его можно интегрировать в скрипт оболочки:Подобные
perl
примеры можно найти в stat perldoc .источник
Я закончил
ls
разбор:Я благодарен за обширный ответ @ slm, но ни один из других методов не является таким простым. Этот
stat
метод потребовал бы от меня написания как минимум двух разных вызовов для покрытия OS X, и даже после этого он возвращает восьмеричное представление, к которому мне все еще нужно применить арифметику. Метод Perl в порядке, но требует, чтобы я запустил интерпретатор для такой простой задачи, и я хотел бы сохранить его простым и использовать только утилиты posix.источник
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Все стандартные инструменты Unix / Linux.
Я полагаю, что возможно иметь групповую запись, но не групповое чтение. В такой возможности это может быть либо оператор case 2 | 3 | 6 | 7), либо grep '[2 | 3 | 6 | 7]'
источник