Як я можу отримати права доступу до восьми файлів з командного рядка?


373

Існує команда chmod для встановлення дозволів на файли, але чи можу я отримати дозволи на файли в восьмеричному режимі (наприклад, 755) з командного рядка?


2
Для таких людей, як я, які випадково потрапили на цю сторінку, але насправді шукали, як це зробити на Mac: stackoverflow.com/a/14855227/470749
Райан

2
stat --format "%A" $FILEнадає читабельному drwxr-x---формату людини . що може бути або не бути корисним.
Тревор Бойд Сміт

Відповіді:


535

Ви можете спробувати

stat -c "%a %n" *

Замініть *відповідний каталог або точне ім'я файлу, яке ви хочете вивчити.

На головній сторінці 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

Використання:

  • З файлами:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • З папками:

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

(Довідка)


57
on mac os, використання stat -f '%A %a %N' *(кредит: geeklog.adamwilson.info/article/58/… )
s2t2

1
Якщо вам зручніше ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends

2
Цикл @usandfriends на виході ls- це погана ідея. Якщо ви дійсно хочете скористатися циклом, який ви можете зробитиfor f in *; do stat "%a %n" "$f"; done
Том Фенек,

1
Чому на mac os все трохи змінено (навіть в unix iso utils)? Чи є фактична причина цього?
Василіс

2
Будь ласка, @hackel, скажи нам, як ти почуваєшся насправді. Лол!
MikeSchinkel

44

Дозволи файлів у Linux можуть відображатися у восьмеричному форматі за допомогою команди stat stat Linux.

Просто натисніть клавішу Ctrl+ Alt+ Tна клавіатурі, щоб відкрити термінал. Коли він відкриється, перейдіть до каталогу, де ви хочете знайти права доступу до файлів у восьмеричному режимі.

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

% Права доступу у читаній для людини формі

% a Права доступу в восьмериці

% n Назва файлу

Восьмі числа та дозволи

Ви можете використовувати восьмеричний номер для представлення режиму / дозволу:

r: 4
w: 2
x: 1

Наприклад, для власника файлів ви можете використовувати восьмеричний режим наступним чином. Дозвіл на читання, запис та виконання (повного) дозволу на файл у восьмериці дорівнює 0 + r + w + x = 0 + 4 + 2 + 1 = 7

Тільки дозвіл на читання та запис у файлі у восьмериці дорівнює 0 + r + w + x = 0 + 4 + 2 + 0 = 6

Тільки дозвіл на читання та виконання файлу у восьмеричному дорівнює 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Використовуйте вищевказаний метод для обчислення дозволу для групи та інших. Скажімо, ви хочете дати повний дозвіл власнику, прочитати та виконати дозвіл на групування та лише дозвол для читання для інших, тоді вам потрібно обчислити дозвіл наступним чином: User = r + w + x = 0 + 4 + 2 + 1 = 7 Група = r + w + x = 0 + 4 + 2 + 0 = 6 Інші = r + w + x = 0 + 0 + 0 + 1 = 1

Дійсний дозвіл - 761.

Джерело: http://kmaiti.blogspot.com/2011/09/umask-concept.html


2
Початкові 0 також представляють спеціальний біт: pastebin.com/6ymkFt71
Braiam

36

Як докладно описано в «755» -Style дозволів з «LS» від Адама Courtemanche на AgileAdam.com , ви можете створити псевдонім lso , який діє як , ls -lале трохи обробляє вихід 1 з дозволами дисплея також в вісімковій системі . До цього додається провідний стовпчик, що показує трицифрові дозволи на 2 вісімки. Як написано, це працює для більшості файлів і каталогів, але воно не працює належним чином, якщо встановлені липкі або 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}'"

Це серйозний недолік, хоча, як techtonik вказує . Ви не можете передати аргументи в цей lsoпсевдонім , як якщо б до в lsкоманді , тому що вони будуть прийняті в якості додаткових аргументів awkзамість. Таким чином, ви не можете запускати lsoпевний файл чи каталог, а також не можете передавати будь-які варіанти (наприклад -F, або --color) lso.


Виправлення полягає у визначенні lso як функції, а не псевдоніму.

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}'; }

Якщо ви інтерактивно випробовуєте це в оболонці, запустіть, unalias lsoщоб видалити псевдонім - це можна зробити до або після того, як ви визначите функцію. Якщо ви розміщуєте його у створеному файлі, наприклад ~/.bashrc, просто вийдіть aliasрядок та додайте визначення функції.

Чому це працює? На відміну від псевдонімів, функції оболонки bash можуть приймати позиційні параметри , тобто аргументи командного рядка . "$@"розширюється до повного списку аргументів , внаслідок чого аргументи lsoфункції передаються ls. (На відміну від визначення псевдоніму, функціональне тіло не цитується; тому потрібно було видалити \символи до $і ".)

Оскільки ви можете передати параметри, lsoколи це визначено як функцію, ви можете видалити параметри -aта -Gпараметри з визначення - ви можете передавати їх вручну в тих випадках, коли ви хочете їх. ( Цей -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}'; }

Дякую техніку за те, що вказав на обмеження у визначенні lsoпсевдоніма, тим самим мотивуючи мене розширити цю посаду матеріалом про те, щоб зробити її замість неї функцією.


1 Можна відзначити, що, здається, спливає загальне правило про несинтез результатівls . lsдає дуже читаний для людини вихід; це вводить ідіосинкразії та обмеження, що робить його взагалі непридатним як вхід для інших команд. В цьому випадку ми розбираємо , lsтак як ми хочемо , щоб зберегти точна поведінкаls , крім нашого одного доданого зміни.

2 Одне обмеження цього псевдоніму, яке також стосується версії функції, показаної під ним, і яку можна вважати помилкою, полягає в тому, що він відображає лише три восьмі цифри, навіть якщо четверта восьми цифра дорівнює нулю. Як jfmercer вже справедливо вказував , що восьмеричні цифри , показані тут , не відображають липкий біт , якщо він присутній, ні Setuid або setgid біт.

- Більш серйозно , ніж просто не показує четверту восьмеричну цифри є те , що цей метод передбачає , що вони не встановлені, і якщо вони є - якщо ви бачите t, sабо Sв рядку дозволу - то ви повинні ігнорувати восьмеричні цифри . Це тому, що біти виводяться з рядка дозволів таким чином, щоб не враховувати липкі біти setuid / setgid.


не працює з каталогами -awk: read error (Is a directory)
anatoly techtonik

@techtonik Дякуємо, що вказали на це! Я (нарешті) оновив цю відповідь, щоб включити виправлення для цього.
Елія Каган

1
Ви можете додати --colorпараметр для шоу кольорівlso() { 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
Ви виявили вирішення проблеми з налаштуванням / встановленням жорстких налаштувань після публікації цього повідомлення?
Сільвестріс

21

Просто розширення \ спрощення попередніх відповідей, пов’язаних зі статистикою:

Ви можете просто запустити:

stat <path_to_file>

Вихід буде містити вісімковий дозвіл разом з іншою інформацією.



Деталі (версія statista та приклад):

# 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

Зверніть увагу на: ( 0644 / -rw-r - r--)


6

Для портативності ви можете використовувати 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

Якщо ви хочете помітити, коли виникає помилка, спробуйте:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

2
Окрім того, що є портативним, рішення @ cuonglm показує чотири восьмеричні символи, а не три , таким чином показує стан "липкого біта", про який часто забувають.
jfmercer

2

Ви можете використовувати findз -printfдією.

lsне показує вісімкові дозволи, але ви можете скористатися цим findбазовим методом:

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

Наприклад, щоб перевірити мій каталог відео:

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

Специфікатор %mформату повідомляє -printfдію надрукувати вісімкові дозволи, в той час як %fспецифікатор формату призводить до друку імені файлу.

Ви можете передати декілька імен файлів до find. Можна навіть використовувати глобуси (наприклад, find * -printf "%m:%f\n").

Вам не доведеться використовувати тест типу -nameабо -iname; достатньо передати імена файлів чи каталогів, які вас цікавлять, як вихідні пункти find. Тобто, подайте їх імена як аргументи відразу після слова find, як показано вище.

findдає вам великий контроль над тим, як він показує вихід. Зокрема, є дві модифікації, які можуть бути корисними:

  • За замовчуванням findповторює підкаталоги, подібні до ls -R. Якщо ви не хочете findвідвідувати підкаталоги початкових точок, які ви переходите до нього, ви можете додати -maxdepth 0(або використовувати -maxdepthз іншими значеннями, щоб вказати, наскільки глибоко ви хочете, щоб він пройшов).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %fпоказує лише ім’я файлу, тому, якщо findдоводиться повторюватись, щоб потрапити до файлу, ви можете не знати, де він знаходиться. Щоб показати шлях, починаючи з того, з якого пункту початку було знайдено файл, використовуйте %pзамість цього.

    $ 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
    ....

Докладніше man findпро використання findкоманди див.

Інший метод ( lsі awk)

Це можна використовувати для списку всіх файлів каталогів з їх дозволами:

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}'

Це по суті та сама команда, що і в псевдонімі Адама Куртеманчеlso , який у цій відповіді цитується, просто виконується як одна команда. Якщо ви використовуєте це лише один раз або рідко, то, можливо, ви не хочете заважати писати це як псевдонім або оболонку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.