Jak mogę uzyskać ósemkowe uprawnienia do plików z wiersza poleceń?

373

Istnieje komenda chmod do ustawiania uprawnień do plików, ale czy mogę uzyskać uprawnienia do plików w trybie ósemkowym (np. 755) z wiersza poleceń?

Anwar
źródło
2
Dla ludzi takich jak ja, którzy przypadkowo wylądowali na tej stronie, ale faktycznie szukali, jak to zrobić na komputerze Mac: stackoverflow.com/a/14855227/470749
Ryan
2
stat --format "%A" $FILEdaje czytelny dla człowieka drwxr-x---format. które mogą, ale nie muszą być przydatne.
Trevor Boyd Smith

Odpowiedzi:

535

Możesz spróbować

stat -c "%a %n" *

Zamień *na odpowiedni katalog lub dokładną nazwę pliku, który chcesz sprawdzić.

Ze strony podręcznika stat ,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

Stosowanie:

  • Z plikami:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Z folderami:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(Odniesienie)

jokerdino
źródło
57
w systemie Mac OS użyj stat -f '%A %a %N' *(kredyt: geeklog.adamwilson.info/article/58/… )
s2t2
1
Jeśli czujesz się bardziej komfortowo z ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends
2
Pętla @usandfriends na wyjściu lsjest złym pomysłem. Jeśli naprawdę chcesz użyć pętli, możesz to zrobićfor f in *; do stat "%a %n" "$f"; done
Tom Fenech
1
Dlaczego na Mac OS wszystko się nieco zmienia (nawet w unixowych aplikacjach iso)? Czy jest tego faktyczny powód?
Vassilis,
2
Proszę @hackel, powiedz nam, jak naprawdę się czujesz. lol!
MikeSchinkel
44

Uprawnienia do plików w systemie Linux można wyświetlić w formacie ósemkowym za pomocą polecenia Linux stat.

Wystarczy nacisnąć Ctrl+ Alt+ Tna klawiaturze, aby otworzyć Terminal. Po otwarciu przejdź do katalogu, w którym chcesz znaleźć uprawnienia do plików w trybie ósemkowym.

stat -c '%A %a %n' *

% A Prawa dostępu w formie czytelnej dla człowieka

% a Prawa dostępu ósemkowe

% n Nazwa pliku

Liczby ósemkowe i uprawnienia

Możesz użyć liczby ósemkowej do przedstawienia trybu / uprawnienia:

r: 4
w: 2
x: 1

Na przykład dla właściciela pliku możesz użyć trybu ósemkowego w następujący sposób. Uprawnienia do odczytu, zapisu i wykonywania (pełne) dla pliku ósemkowego to 0 + r + w + x = 0 + 4 + 2 + 1 = 7

Tylko uprawnienie do odczytu i zapisu dla pliku ósemkowego wynosi 0 + r + w + x = 0 + 4 + 2 + 0 = 6

Tylko odczyt i wykonanie uprawnienia do pliku ósemkowego to 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Użyj powyższej metody, aby obliczyć uprawnienia dla grupy i innych osób. Powiedzmy, że chcesz udzielić pełnego pozwolenia właścicielowi, odczytywać i wykonywać uprawnienia do grupowania, a także odczytywać uprawnienia tylko dla innych, a następnie musisz obliczyć uprawnienia w następujący sposób: Użytkownik = r + w + x = 0 + 4 + 2 + 1 = 7 Grupa = r + w + x = 0 + 4 + 2 + 0 = 6 Inne = r + w + x = 0 + 0 + 0 + 1 = 1

Skuteczne zezwolenie wynosi 761.

Źródło: http://kmaiti.blogspot.com/2011/09/umask-concept.html

Mitch
źródło
2
Początkowe 0 również reprezentuje specjalny bit: pastebin.com/6ymkFt71
Braiam
36

Jak wyszczególniono w „755” -Style uprawnień z „ls” przez Adama Courtemanche na AgileAdam.com , można utworzyć alias lso , który działa jak ls -lale nieznacznie przetwarza wyjście 1 do uprawnień wyświetlacza również w ósemkowym. Dodaje to wiodącą kolumnę pokazującą trzycyfrowe uprawnienia 2- ósemkowe. Jak napisano, działa to w przypadku większości plików i katalogów, ale nie działa poprawnie, jeśli ustawione są bity lepkie lub setuid / setgid . 3)

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

Ma to jednak poważną wadę , jak wskazuje techtonik . Państwo nie może przekazywać argumenty do tego lsoaliasu tak jak do tej lskomendy , ponieważ są one traktowane jako dodatkowe argumenty awkzamiast. W związku z tym nie można uruchamiać lsookreślonego pliku lub katalogu ani przekazywać żadnych opcji (takich jak -Flub --color) do lso.


Rozwiązaniem jest zdefiniowanie lso jako funkcji, a nie aliasu.

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Jeśli wypróbowujesz to interaktywnie w swojej powłoce, uruchom, unalias lsoaby usunąć alias - możesz to zrobić przed lub po zdefiniowaniu funkcji. Jeśli umieszczasz go w pliku źródłowym, takim jak ~/.bashrc, po prostu wyjmij aliaslinię i dodaj definicję funkcji.

Dlaczego to działa? W przeciwieństwie do aliasów, funkcje powłoki bash mogą przyjmować parametry pozycyjne , tj . Argumenty wiersza poleceń . "$@"rozwija się do pełnej listy argumentów , powodując przekazanie argumentów do lsofunkcji ls. (W przeciwieństwie do definicji aliasu, treść funkcji nie jest cytowana; dlatego konieczne było usunięcie \znaków przed $i ".)

Ponieważ możesz przekazać opcje, lsogdy zdefiniujesz w ten sposób jako funkcję, możesz usunąć opcje -ai -Gz definicji - możesz przekazać je ręcznie w przypadkach, w których chcesz. ( Opcja jest wymagana do informacji takich jak uprawnienia do plików mają być wyświetlane w ogóle , więc nie ma korzyści do usuwania go.)-l

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Dzięki techtonik za wskazanie ograniczenia w definiowaniu lsojako alias, co zmotywowało mnie do rozszerzenia tego postu o materiał na temat uczynienia go zamiast tego funkcją.


1 Można zauważyć, że wydaje się to lekceważyć ogólną zasadę nie analizowania wynikówls . lszapewnia wyjście bardzo czytelne dla człowieka; wprowadza to osobliwości i ograniczenia, przez co ogólnie nie nadaje się jako dane wejściowe dla innych poleceń. W tym przypadku analizujemy, lsponieważ chcemy zachować dokładne zachowaniels oprócz naszej jednej dodanej zmiany.

2 Jednym z ograniczeń tego aliasu, który ma również zastosowanie do pokazanej poniżej wersji funkcji i który można uznać za błąd, jest to, że wyświetla on tylko trzy cyfry ósemkowe, nawet gdy czwarta cyfra ósemkowa wynosi zero. Jak jfmercer został słusznie zauważył , cyfry ósemkowe wyświetlane tutaj nie odzwierciedlają sticky bit jeżeli jest obecny, ani suid lub sgid bitów.

3 poważniej niż tylko nie pokazuje czwartą cyfrę ósemkowy jest to, że metoda ta zakłada, że nie są one ustawione, a jeśli są - jeśli widzisz t, slub Sw ciągu uprawnień - to należy lekceważyć cyfry ósemkowe . Jest tak, ponieważ bity są wywnioskowane z ciągu uprawnień w sposób, który nie uwzględnia lepkich bitów setuid / setgid.

Eliah Kagan
źródło
nie działa z katalogami -awk: read error (Is a directory)
anatoly techtonik
@techtonik Dziękujemy za zwrócenie na to uwagi! (W końcu) zaktualizowałem tę odpowiedź, aby zawierała poprawkę.
Eliah Kagan,
1
Możesz dodać --colorparametr kolorów pokazulso() { ls -alG "$@" --color | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
tagplus5
1
Czy odkąd to opublikowałeś, znalazłeś rozwiązanie kleistego problemu z setuid / setgid?
Silvestris
21

Po prostu rozszerzam \ upraszczając poprzednie odpowiedzi związane ze „stat”:

Możesz po prostu uruchomić:

stat <path_to_file>

Dane wyjściowe będą zawierały uprawnienia ósemkowe wraz z innymi informacjami.



Szczegóły (wersja statystyki i przykład):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

Zauważ, że: ( 0644 / RW-R - R-),

Vano
źródło
6

Aby zapewnić przenośność, możesz użyć perl:

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

Jeśli chcesz zauważyć, kiedy wystąpi błąd, spróbuj:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
Cuonglm
źródło
2
Oprócz bycia przenośnym, rozwiązanie @ cuonglm pokazuje cztery znaki ósemkowe zamiast trzech , pokazując w ten sposób stan „lepkiego bitu”, o którym często się zapomina.
jfmercer
2

Możesz użyć findz -printfakcją.

lsnie pokazuje uprawnień ósemkowych, ale możesz skorzystać z tego findobejścia:

find path -printf "%m:%f\n"

Na przykład, aby sprawdzić mój katalog wideo:

$ find Videos -printf "%m:%f\n"
755:Videos

Specyfikator %mformatu nakazuje -printfakcji wydrukowanie uprawnień ósemkowych, a specyfikator %fformatu powoduje wydrukowanie nazwy pliku.

Możesz przekazać wiele nazw plików do find. Możesz nawet używać globów (np find * -printf "%m:%f\n".).

Nie musisz używać testu takiego jak -namelub -iname; wystarczy podać nazwy plików lub katalogów, którymi jesteś zainteresowany, jako punkty wyjścia find. To znaczy, podaj ich nazwy jako argumenty bezpośrednio po słowie find, jak pokazano powyżej.

finddaje doskonałą kontrolę nad sposobem wyświetlania wyników. W szczególności istnieją dwie modyfikacje, które mogą okazać się przydatne:

  • Domyślnie findrekursuje podkatalogi, podobnie jak ls -R. Jeśli nie chcesz findodwiedzać podkatalogów punktów początkowych, które mu przekazujesz, możesz dodać -maxdepth 0(lub użyć -maxdepthz innymi wartościami, aby wskazać, jak głęboko chcesz zejść).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fpokazuje tylko nazwę pliku, więc jeśli findtrzeba powtórzyć, aby dostać się do pliku, możesz nie wiedzieć, gdzie się on znajduje. Aby wyświetlić ścieżkę, zaczynając od dowolnego punktu początkowego, w którym plik został znaleziony, użyj %pzamiast tego.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

Zobacz man findwięcej informacji na temat używania findpolecenia.

Inna metoda ( lsi awk)

Można to wykorzystać do wyświetlenia listy wszystkich plików katalogu z ich uprawnieniami:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Jest to w zasadzie to samo polecenie, co w aliasie Adama Courtemanche'also , który przywołano w tej odpowiedzi , wystarczy uruchomić jako jedno polecenie. Jeśli używasz tego tylko raz lub w rzadkich przypadkach, możesz nie chcieć zawracać sobie głowy pisaniem go jako aliasu lub funkcji powłoki.

Maythux
źródło