Мне нужно установить тот же chmod, как получить номер для -rw-r - r-- ?
chmod
поддерживает ли он --reference
: «--reference = RFILE использует режим RFILE вместо значений MODE» - man chmod.
Мне нужно установить тот же chmod, как получить номер для -rw-r - r-- ?
chmod
поддерживает ли он --reference
: «--reference = RFILE использует режим RFILE вместо значений MODE» - man chmod.
Ответы:
Пожалуйста, проверьте stat
вывод:
# stat .xsession-errors
File: ‘.xsession-errors’
Size: 839123 Blocks: 1648 IO Block: 4096 regular file
Device: 816h/2070d Inode: 3539028 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/ lik) Gid: ( 1000/ lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
Birth: -
stat -c %a /path/to/file
это магический трюк, который вам нужен.
Полный номер режима разрешений представляет собой 4-значное восьмеричное число, хотя в большинстве случаев вы используете только 3 наименее значащие цифры. Добавьте каждую группу в строку прав доступа, приняв r = 4, w = 2, x = 1. Например:
421421421
-rwxr-xr--
\_/ -- r+w+x = 4+2+1 = 7
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+_ = 4+0+0 = 4 => 0754
Теперь иногда вы увидите странную скромную строку, подобную этой:
-rwsr-xr-T
Четвертая цифра перегружена на x
биты в скромной строке. Если вы видите букву, отличную от x
этой, то это означает, что установлен один из этих «специальных» четырехзначных битов, а если буква в нижнем регистре, то x
для этой позиции также устанавливается. Таким образом, перевод для этого:
4 2 1
421421421
-rwsr-xr-T
+ + + -- s+_+T = 4+0+1 = 5
\_/ -- r+w+s = 4+2+1 = 7 (s is lowercase, so 1)
\_/ -- r+_+x = 4+0+1 = 5
\_/ -- r+_+T = 4+0+0 = 4 (T is uppercase, so 0) => 05754
Стандартный способ UNIX показать, что число является восьмеричным, состоит в том, чтобы начать его с нуля. GNU chmod
примет, что режим, который вы задаете, является восьмеричным, но безопаснее всего ставить ноль.
Наконец, если вы видите +
в конце скромную строку:
-rwxr-xr-x+
тогда это означает, что файл имеет расширенные разрешения, и вам нужно больше, чем chmod
. Посмотрите в setfacl
и getfacl
команды, для начала.
Разрешения - это просто строковое представление двоичного числа.
В 0
основном -
это буквы, остальные буквы.
Для основных разрешений:
Конвертировать все -
и заглавные буквы S
или T
в 0
, остальные должны представлять 1
.
Полученное двоичное число, построенное таким образом, должно быть напечатано как восьмеричное:
$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644
В одну строку:
$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644
Исправление ошибок и обнаружение других 3 битов 1000
, 2000
или 4000
требуется еще немного кода:
#!/bin/bash
Say (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }
e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"
a=$1
((${#a}>10)) && SayError 1 "$e1"
((${#a}==10)) && { Say "$e2"; a=${a#?}; }
((${#a}<9)) && SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9)) && SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4))
[[ $a =~ [sS]...$ ]] && c=$((c|2))
[[ $a =~ [tT]$ ]] && c=$((c|1))
printf '%04o\n' "$((2#$b|c<<9))"
Получить список файлов с их строковыми и шестнадцатеричными значениями разрешений. Помещение% N в конце, чтобы легче было выводить в Excel.
stat -c "%A %a %N" *
-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'
Это найдет все файлы с определенным шестнадцатеричным разрешением.
find /tmp1 -user root -perm 644