Як отримати номер дозволу за рядком: -rw-r - r--


53

Мені потрібно встановити той самий chmod, як отримати число для -rw-r - r-- ?


2
Програмно чи просто потрібно знати, як перекладати?
mattdm

Мені лінь перекладати :) stat мені на хвилину добре.
cнд

9
Що ви маєте на увазі під «встановити те саме»? У вас вже є файл з -rw-r - r-- дозволом і хочете встановити інший файл із тими ж дозволами? Потім подивіться, чи chmodпідтримують ваші --reference: "--reference = RFILE використовуйте режим RFILE замість значень MODE" - man chmod.
манастирські роботи


Який Unix ви використовуєте?
Kusalananda

Відповіді:


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


26

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

Нарешті, якщо ви побачите a +в кінці скромного шрифту:

-rwxr-xr-x+

то це означає, що файл має розширені дозволи, і вам знадобиться більше chmod. Подивіться в setfaclі getfaclкоманди, для початку.



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 *
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.