Chciałbym sprawdzić uprawnienia grupy do pliku ze skryptu bash. W szczególności muszę sprawdzić, czy plik ma zapisany bit grupy.
Otóż to. Proste. Jednak:
- Potrzebuję również tego, aby był przenośny.
test -w <file
nie powie mi, czy można to zapisać w grupie.- Dane wyjściowe
ls -ld
są dobre dla ludzi, ale nie tak pewne co do skryptów. Technicznie mógłbym przeanalizować dane wyjściowe, na przykład wdrwxrwxr-x
celu wyodrębnienia bitów grupy, ale wydaje się to kruche. - Interfejs dla
stat
jest całkowicie niekompatybilny między OS X a innymi systemami. find <file> -perm ...
nie może być odpowiedź?
bash
permissions
ls
stat
mislav
źródło
źródło
Odpowiedzi:
Metoda nr 1 - stat
Możesz użyć
stat
polecenia, aby uzyskać bity uprawnień.stat
jest dostępny na większości Uniksów (OSX, BSD, a nie AIX z tego, co mogę znaleźć). To powinno działać na większości Uniksów, z wyjątkiem OSX i BSD z tego, co mogę znaleźć.Przykład
Użyj tego polecenia:
I użyj prostego,
grep
aby sprawdzić, czy tryb uprawnień dla grup to 6 czy 7.Dla OSX i BSD trzeba by skorzystać z tej formy
stat
,stat -f
(albostat -x
) i analizować odpowiednio. Ponieważ opcjestat
są różne, możesz zawinąć to polecenie wlsb_release -a
polecenie i wywołać odpowiednią wersję na podstawie systemu operacyjnego. Nie idealny, ale wykonalny. Zdaj sobie sprawę, żelsb_release
jest to dostępne tylko dla dystrybucji Linuksa, więc należałoby opracować inną alternatywę do testowania innych systemów uniksowych.Metoda nr 2 - znajdź
Myślę, że to polecenie może ci lepiej służyć. I sprawia, że wykorzystanie
find
iprintf
przełącznik.Przykład
Metoda nr 3 - Perl
Perl może być bardziej przenośnym sposobem na zrobienie tego w zależności od systemów operacyjnych, które próbujesz zainstalować.
UWAGA: Powyższe wykorzystuje
stat()
funkcję Perla do zapytania bitów systemu plików.Możesz uczynić to bardziej kompaktowym, rezygnując z używania tablicy
@pv
i zajmując się wynikamistat()
:źródło
stat
Polecenie różni się w zależności od systemu i nie jest przenośne.find . -printf
mogę to zrobić, ale nie mogę ustalić, czy jest dostępne w znalezieniu OSX.Jedną z opcji jest użycie
perl
, które będzie przenośne wszędzie, gdzieperl
jest dostępna. Bez niego trudno jest znaleźć system uniksowy. Oto przykład, w jaki sposób można go zintegrować ze skryptem powłoki:Podobne
perl
przykłady można znaleźć w stat perldoc .źródło
Skończyło się na
ls
analizie:Jestem wdzięczny za obszerną odpowiedź @ slm, ale żadna z pozostałych metod nie jest tak prosta.
stat
Metoda wymagałaby mi napisać co najmniej dwa różne wywołania na pokrycie OS X, a nawet po tym zwraca reprezentację ósemkowej które wciąż muszą stosować się do arytmetyki. Metoda Perla jest OK, ale wymaga ode mnie uruchomienia interpretera dla tak prostego zadania, i chciałbym, aby była prosta i używała tylko narzędzi POSIX.źródło
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Wszystkie standardowe narzędzia Unix / Linux.
Przypuszczam, że MOŻLIWE jest zapisywanie grupowe, ale nie odczytywanie grupowe. W takiej możliwości byłoby to albo oświadczenie o sprawie 2 | 3 | 6 | 7), albo grep „[2 | 3 | 6 | 7]”
źródło