Как я могу получить разрешения восьмеричного файла из командной строки?
Существует команда chmod для установки прав доступа к файлам, но можно ли получить права доступа к файлам в восьмеричном режиме (например, 755) из командной строки?
7 ответов
Ты можешь попробовать
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
Используйте вышеуказанный метод для расчета разрешения для группы и других. Допустим, вы хотите дать полное разрешение владельцу, разрешение на чтение и выполнение для группы и разрешение только на чтение для других, а затем вам нужно рассчитать разрешение следующим образом: Пользователь = 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" Адама Куртманша на http://agileadam.com/, вы можете создать псевдоним lso
это действует как ls -l
но слегка обрабатывает вывод 1 для отображения разрешений также в восьмеричном виде. Это добавляет начальный столбец, показывающий трехзначные 2 восьмеричные разрешения. Как написано, это работает для большинства файлов и каталогов, но не работает должным образом, если установлены биты sticky или 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}'"
Это, однако, имеет серьезный недостаток, как anatoly 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
и добавьте определение функции.
Почему это работает? В отличие от псевдонимов, функции оболочки 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}'; }
Спасибо anatoly techtonik за указание на ограничение в определении lso
как псевдоним, таким образом мотивируя меня расширить этот пост материалом о том, чтобы сделать его вместо этого функцией.
1 Можно заметить, что это нарушает общее правило об отсутствии анализа ls
, ls
производит очень удобочитаемый вывод; это вводит идиосинкразии и ограничения, делающие его вообще непригодным в качестве ввода для других команд. В этом случае мы разбираем ls
так как мы хотим сохранить точное поведение ls
кроме нашего одного добавленного изменения.
2 Одно из ограничений этого псевдонима, которое также применяется к версии функции, показанной ниже, и которая может рассматриваться как ошибка, состоит в том, что он отображает только три восьмеричных цифры, даже когда четвертая восьмеричная цифра равна нулю. Как правильно заметил jfmercer, восьмеричные цифры, отображаемые здесь, не отражают бит закрепления, если он присутствует, ни биты setuid или setgid.
3 Более серьезно, чем просто не показывать четвертую восьмеричную цифру, заключается в том, что этот метод предполагает, что они не установлены, а если они установлены - если вы видите t
, s
, или же S
в строке разрешения - тогда вы должны игнорировать восьмеричные цифры. Это связано с тем, что биты выводятся из строки разрешений таким образом, что не учитываются липкие биты setuid / setgid.
Просто расширяем \ упрощаем предыдущие ответы, связанные с "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--)
Для мобильности вы можете использовать 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($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'