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

288

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

    
задан Anwar 17.06.2012 в 10:04
источник

6 ответов

418

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

stat -c "%a %n" *

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

В странице man 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/
    

(Ссылка)     

ответ дан jokerdino 17.06.2012 в 10:08
источник
35

Разрешения на доступ к файлам в 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

     

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

Источник: Ссылка

    
ответ дан Mitch 17.06.2012 в 10:14
32

Как описано в "755" -стерильных разрешениях с '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 "[email protected]" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

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

Почему это работает? В отличие от псевдонимов функции оболочки bash могут принимать позиционные параметры , т. е. аргументы командной строки . "[email protected]" расширяется до полного списка аргументов , вызывая аргументы для lso , которая будет передана в ls . (В отличие от определения псевдонима, тело функции не цитируется, поэтому необходимо удалить символы \ до $ и " .)

Поскольку вы можете передавать параметры lso , если они определены таким образом как функция, вы можете удалить опции -a и -G из определения - вы можете передать их вручную в тех случаях, когда вы хотите их , ( Опция -l требуется для подробностей например, разрешения на доступ к файлам, которые будут отображаться вообще , поэтому нет никакой пользы для его удаления.)

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

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

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

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

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

    
ответ дан Eliah Kagan 17.06.2012 в 10:12
16

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

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

stat <path_to_file>

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



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

# stat --version
stat (GNU coreutils) 8.4


[[email protected] ~]# touch /tmp/TEST_PERMISSONS

[[email protected] ~]# chmod 644 /tmp/TEST_PERMISSONS

[[email protected] ~]# 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 -)

    
ответ дан Vano 26.08.2015 в 18:07
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
    
ответ дан cuonglm 21.09.2014 в 17:30
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(,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

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

    
ответ дан Maythux 07.03.2014 в 08:16