Вопрос Как я могу получить разрешения на восьмеричные файлы из командной строки?


Eсть CHMOD чтобы установить права доступа к файлам, но могу ли я получить разрешения файлов в восьмеричном режиме (например, 755) из командной строки?


316
2018-06-17 08:04


происхождения




ответы:


Можешь попробовать

stat -c "%a %n" *

замещать * с соответствующим каталогом или точным именем файла, которое вы хотите изучить.

Из man page 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/
    

(Справка)


450
2018-06-17 08:08



на mac os, используйте stat -f '%A %a %N' * (Кредит: geeklog.adamwilson.info/article/58/...) - s2t2
Если вам удобнее ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends зацикливаются на выходе ls это плохая идея. Если вы действительно хотите использовать цикл, вы можете сделать for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Почему на Mac OS все немного изменилось (даже в unix iso utils)? Есть ли настоящая причина этого? - Vassilis
Пожалуйста, @hackel, расскажите, как вы себя чувствуете. лол! - MikeSchinkel


Разрешения для файлов в Linux можно отобразить в восьмеричном формате с помощью команды Linux stat.

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

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

% A Права доступа в удобочитаемой форме

% 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 Group =   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


37
2018-06-17 08:14



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


Как указано в "755" -стильные разрешения с 'ls' от Адам Courtemanche на AgileAdam.com, вы можете создать псевдоним  lso который действует как ls -l но слегка обрабатывает выход1 для отображения разрешений также в восьмеричном. Это добавляет ведущий столбец с тремя знаками2 восьмеричные разрешения. Как написано, это работает для большинства файлов и каталогов, но оно работает неправильно, если липкий или УИП / 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}'; }

Благодаря techtonik для указав ограничение в определении lso как псевдоним, тем самым мотивируя меня расширять этот пост материалами о том, чтобы сделать его функцией.


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

2Одно ограничение этого псевдонима, которое также относится к версии функции, показанной ниже, и которая может считаться ошибкой, состоит в том, что она отображает только три восьмеричные цифры даже когда четвертая восьмеричная цифра равна нулю. В виде jfmercer имеет правильно указал, отображаемые здесь восьмеричные цифры не отражают липкий бит, если они присутствуют, или биты setuid или setgid.

3Более серьезно, чем просто не показывать четвертую восьмеричную цифру, этот метод предполагает они не установлены, и если они есть - если вы видите t, s, или S в строке разрешения - тогда вы должны игнорировать восьмеричные цифры, Это связано с тем, что биты выводятся из строки разрешений способом, который не учитывает липкие биты setuid / setgid.


33
2018-06-17 08:12



не работает с каталогами - awk: read error (Is a directory) - anatoly techtonik
@techtonik Спасибо, что указали это! Я (наконец) обновил этот ответ, включив в него исправление. - Eliah Kagan
Можете добавить --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


Просто расширяя \ упрощая предыдущие ответы «stat»:

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

stat <path_to_file>

Выход будет содержать восьмеричное разрешение вместе с другой информацией.



Подробности (стат-версия и пример):

# 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--)


17
2017-08-26 16:07





Для переносимости вы можете использовать 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

6
2017-09-21 15:30



В дополнение к переносимости, решение @ cuonglm показывает четыре восьмеричные символы, а не три, тем самым демонстрируя состояние «липкого бита», о котором часто забывают. - jfmercer


Вы можете использовать find с -printf действие.

ls не показывает восьмеричные разрешения, но вы можете использовать это findоснованный на использовании:

find дорожка -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}'

Это по существу та же самая команда, что и в Адам Courtemanche's lso псевдоним, который этот ответ цитируется, просто запускается как одна команда. Если вы используете это только один раз или в редких случаях, то вам, возможно, не захочется писать его как функцию псевдонима или оболочки.


2
2018-03-07 07:16