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

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

376
задан 21 September 2014 в 19:31

6 ответов

Можно попробовать

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/
    

(Ссылка)

539
ответ дан 21 September 2014 в 19:31

Просто расширяем \ упрощаем предыдущие ответы, связанные с «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 -)

0
ответ дан 21 September 2014 в 19:31

Для мобильности можно использовать 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
ответ дан 21 September 2014 в 19:31

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

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

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

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

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

% n Имя файла

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

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

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

Используйте вышеуказанный метод для расчета разрешения для группы и других лиц. Допустим, вы хотите дать полное разрешение владельцу, читать и выполнить разрешение на группирование и разрешение только на чтение для других, затем необходимо рассчитать разрешение следующим образом: Пользователь = 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

0
ответ дан 21 September 2014 в 19:31

Можно использовать find с -printf действие.

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

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

Например, для проверки моего каталога Videos:

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

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

2
ответ дан 21 September 2014 в 19:31

Как детализировано в “755” - разрабатывают полномочия с ‘ls’ Adam Courtemanche на AgileAdam.com, можно создать псевдоним lso это действует как ls -l но немного обрабатывает output1 для отображения полномочий также в восьмеричном. Это добавляет ведущий столбец, показывающий три-digit2 восьмеричные полномочия. Как записано, это работает на большинство файлов и каталогов, но это не работает правильно, если липкие или 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 строка и добавляет функциональное определение.

Почему это работает? В отличие от псевдонимов, функции оболочки удара могут взять позиционные параметры, т.е. параметры командной строки. "$@" расширяется до полного списка аргументов, вызывая аргументы 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 как псевдоним, таким образом заставляя меня развернуть это сообщение с материалом о создании его функция вместо этого.


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

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

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

36
ответ дан 21 September 2014 в 19:31

Другие вопросы по тегам:

Похожие вопросы: