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

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

308 голосов | спросил Anwar 17 J0000006Europe/Moscow 2012, 12:04:40

6 ответов


444

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

stat -c "% a% n" *

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

В странице man stat ,

-c --format = FORMAT
          используйте указанный FORMAT вместо стандартного; выводить новую строку после
          каждое использование FORMAT
% a Права доступа в восьмеричном
% n Имя файла

Применение:

  • С файлами:

    $ stat -c "% a% n" ./Documents/Udev.html
    664 ./Documents/Udev.html
    
  • С папками:

    $ stat -c "% a% n" ./Documents/
    755 ./Documents/
    

(Ссылка)

ответил jokerdino 17 J0000006Europe/Moscow 2012, 12:08:15
37

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

     

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

ответил Mitch 17 J0000006Europe/Moscow 2012, 12:14:55
32

Как описано в â € œ755â € -стильные разрешения с помощью â € ~lsâ € ™ Adam Courtemanche на < a href = "http://agileadam.com/" rel = "noreferrer"> AgileAdam.com , вы можете создать псевдоним lso, который действует как ls -l, но слегка обрабатывает вывод 1 , чтобы отображать разрешения также в восьмеричном. Это добавляет ведущий столбец, содержащий трехзначные 2 восьмеричные разрешения. Как написано, это работает для большинства файлов и каталогов, но оно работает неправильно, если липкий или setuid /setgid установлены. 3

 alias lso = "ls -alG | awk '{k = 0; для (i = 0; i <= 8; i ++) k + = ((substr ( \ $ 1, i + 2,1) ~ /[rwx] /) * 2 ^ (8-i)), если (k) printf (\ "% 0o \", k); print} '"

У этого есть серьезный недостаток, поскольку techtonik указывает на . Вы не можете передавать аргументы этому псевдониму lso, как вы хотели бы команда ls , потому что они приняты в качестве дополнительных аргументов для awk . Таким образом, вы не можете запускать lso в конкретном файле или каталоге и не можете передавать какие-либо параметры (например, -F или - color)) РБП.


Исправление состоит в том, чтобы определить lso как функция , а не псевдоним.

 lso () {ls -alG "$ @" | awk '{k = 0, для (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, для (i = 0; i <= 8; i ++) k + = ((substr ($ 1, i + 2,1) ~ /[rwx] /) * 2 ^ (8-i))) ; if (k) printf ("% 0o", k); print} '; }

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


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

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

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

ответил Eliah Kagan 17 J0000006Europe/Moscow 2012, 12:12:41
17

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

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

stat <path_to_file>

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



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

# 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
  Файл: `/tmp /TEST_PERMISSONS '
  Размер: 0 Блоки: 0 IO Block: 4096 обычный пустой файл
Прибор: fd00h /64768d Inode: 1010058 Ссылки: 1
Доступ: (0644 /-rw-r - r--) Uid: (0 /root) Gid: (0 /root)
Доступ: 2015-08-26 18: 58: 59.000000000 +0300
Изменить: 2015-08-26 18: 58: 59.000000000 +0300
Изменение: 2015-08-26 18: 59: 16.000000000 +0300

Обратите внимание: ( 0644 /- rw-r - r -)

ответил Vano 26 PM00000070000002131 2015, 19:07:21
6

Для переносимости вы можете использовать perl:

$ perl -e 'printf "% 04o% s \ n", (stat) [2] & 07777, $ _ для @ARGV '* .txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

Если вы хотите заметить, когда возникает ошибка, попробуйте:

perl -e '
для (@ARGV) {
    print "$ !: $ _ \ n" и далее, если -e;
    printf "% 03o% s \ n", (stat) [2] & 07777, $ _;
}
' *.текст
ответил cuonglm 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 21 Sep 2014 19:30:28 +0400 2014, 19:30:28
2

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

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

 найти  путь  -printf "% m:% f \ n"

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

$ find Videos -printf "% m:% f \ n"
755: Видео

Спецификатор формата % 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: Документы
    
  • % f показывает только имя файла, поэтому, если find должен переписываться, чтобы перейти к файлу, возможно, вы не знаете, где он находится. Чтобы показать путь, начиная с какой-либо начальной точки, файл был найден, используйте % p.

    $ find /boot -printf "% m:% p \ n"
    755: /загрузки
    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, для (i = 0; i <= 8; i ++) k + = ((substr ($ 1, i + 2,1) ~ /[rwx] /) \
             * 2 ^ (8-i)), если (k) printf ("% 0o", k); print} '

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

ответил Maythux 7 MaramFri, 07 Mar 2014 11:16:04 +04002014-03-07T11:16:04+04:0011 2014, 11:16:04

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132