Существует команда chmod для установки прав доступа к файлам, но могу ли я получить разрешения файлов в восьмеричном режиме (например, 755) из командной строки?
Существует команда 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: 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.
Источник: Ссылка
Как описано в "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.
Просто расширяя \ упрощая предыдущие ответы '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 -)
Для переносимости вы можете использовать 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
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
Адама Кордемана , который этот ответ , просто запускается как одна команда. Если вы используете это только один раз или в редких случаях, то вы можете не захотеть писать его как функцию псевдонима или оболочки.