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

Это должно удалить их:

sudo apt-get remove --purge burg burg-common burg-emu burg-pc burg-themes burg-themes-common
1
задан 21 September 2014 в 20:31

5 ответов

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

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

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

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

% a Права доступа в octal

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

Источник: http://kmaiti.blogspot.com/2011/09/ Umask-concept.html

36
ответ дан 25 May 2018 в 10:04

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

Это имеет серьезный недостаток, хотя, поскольку [d1 ] Указывает «755» -стильные разрешения с 'ls' . Вы Adam Courtemanche к этому псевдониму lso, как и к команде ls, потому что вместо этого они приняты как дополнительные аргументы AgileAdam.com . Таким образом, вы не можете запустить 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 могут принимать позиционные параметры, т. Е. команда ls . "$@" расширяется до полного списка аргументов, в результате чего аргументы функции lso передаются на ls. (В отличие от определения псевдонима, тело функции не цитируется, поэтому необходимо было удалить символы \ до $ и ".)

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

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, кроме нашего добавленного изменения.

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

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

32
ответ дан 25 May 2018 в 10:04
  • 1
    не работает с каталогами - awk: read error (Is a directory) – anatoly techtonik 25 July 2014 в 12:25
  • 2
    @techtonik Спасибо, что указали это! Я (наконец) обновил этот ответ, включив в него исправление. – Eliah Kagan 10 April 2015 в 23:37
  • 3
    Вы можете добавить параметр --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 13 March 2017 в 04:03

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

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

stat <path_to_file>

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

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

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

16
ответ дан 25 May 2018 в 10:04

Для переносимости вы можете использовать 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
ответ дан 25 May 2018 в 10:04
  • 1
    В дополнение к портативности решение @ cuonglm показывает четыре восьмеричные символы, а не три , таким образом отображая состояние «липкого бита», о чем часто забывают. – jfmercer 22 July 2015 в 17:28

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

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

[ f1]

Например, чтобы проверить каталог «Видео»:

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

Дополнительную информацию об использовании команды find см. в man 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}'

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

2
ответ дан 25 May 2018 в 10:04

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

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