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

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

7 ответов

Решение

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

stat -c "%a %n" *

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

Со страницы руководства 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/
    

(Ссылка)

Права доступа к файлам в 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'
Другие вопросы по тегам