Как получить номер разрешения по строке: -rw-r - r--

53

Мне нужно установить тот же chmod, как получить номер для -rw-r - r-- ?

CND
источник
2
Программно или вам просто нужно уметь переводить?
Mattdm
Мне лень переводить :) Стат на минутку для меня.
CND
9
Что вы подразумеваете под «установить то же самое»? У вас уже есть файл с разрешением -rw-r - r-- и вы хотите установить другой файл с такими же разрешениями? Затем посмотрите, chmodподдерживает ли он --reference: «--reference = RFILE использует режим RFILE вместо значений MODE» - man chmod.
Манатворк
Какой Unix вы используете?
Кусалананда

Ответы:

53

Пожалуйста, проверьте 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: -
Лик
источник
11
stat -c %a /path/to/fileэто магический трюк, который вам нужен.
fromnaboo
и ответ находится в блоке доступа там выше. Файл, который он использовал в этом примере, имеет другой доступ, чем тот, который указан в вопросе. тот, о котором идет речь, показал бы Доступ: (0644 / -rw-r - r--)
nycynik
65
r=4
w=2
x=1

в каждой группе. Ваш пример: 6 (r + w = ​​4 + 2) 4 (r = 4) 4 (r = 4).

Ян Марек
источник
26

Полный номер режима разрешений представляет собой 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команды, для начала.

Jander
источник
10

Это может быть просто

-bash-3.2$ stat --format=%a sample_file
755
Шридхар
источник
3

Разрешения - это просто строковое представление двоичного числа.
В 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))"
Стрелка
источник
0

Получить список файлов с их строковыми и шестнадцатеричными значениями разрешений. Помещение% 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
МакГайвер
источник
-2

Для всех одновременных файлов в Dir

-bash-4.1$ chmod -R 640 *

Для всех файлов

-bash-4.1$ chmod 640 *
Shekar
источник