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

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

Вы можете попробовать

stat -c "%a %n" *

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

Из справочная страница статистики,

-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/

(Ссылка)

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

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

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

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

%a Права доступа в восьмеричном формате

%n Имя файла

Восьмеричные числа и разрешения

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

r: 4w: 2x: 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

Как подробно описано в разрешения в стиле “755” с буквой "ls’ около Адам Кортманш на 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}'"

Однако у этого есть серьезный недостаток, поскольку техтоник указывает на. Ты не удается передать аргументы к этому 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 имеет правильно указано, отображаемые здесь восьмеричные цифры не отражают бит sticky, если он присутствует, а также биты setuid или setgid.

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

Просто расширяя \ упрощая предыдущие ответы, связанные со статистикой:

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

stat <path_to_file>

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



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

# stat --versionstat (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 fileDevice: fd00h/64768d    Inode: 1010058     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)Access: 2015-08-26 18:58:59.000000000 +0300Modify: 2015-08-26 18:58:59.000000000 +0300Change: 2015-08-26 18:59:16.000000000 +0300

Обратите внимание на: (0644/-rw-r-r-)

Для удобства переносимости вы можете использовать perl:

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

Если вы хотите заметить, когда возникает ошибка, попробуйте:

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

Вы можете использовать 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:/boot644:/boot/initrd.img-4.4.0-92-generic600:/boot/System.map-4.4.0-93-generic600:/boot/vmlinuz-4.4.0-92-generic600:/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 в другой раз, который этот ответ цитируется, просто выполняется как одна команда. Если вы используете это только один раз или в редких случаях, то, возможно, вам не захочется утруждать себя написанием его как псевдонима или функции оболочки.

Вы можете использовать псевдоним, который покажет список, несколько похожий на "ls";:

alias lm='stat -c "%-05a %-12A %-5U %5G %s   %-015F %n" * | numfmt --to=iec --field=5 --padding=6'

Для таких людей, как я, которые случайно попали на эту страницу, но на самом деле искали, как это сделать на Mac: macos - UNIX / Linux / Mac OSX get permission of file as number - Stack Overflow

stat --format "%A" $FILE дает вам удобочитаемый формат drwxr-x---. что может быть полезно, а может и не быть.