Come ottenere il numero di autorizzazione per stringa: -rw-r - r--


53

Devo impostare lo stesso chmod, come ottenere il numero per -rw-r - r-- ?


2
A livello di programmazione o hai solo bisogno di sapere come tradurre?
Mattdm,

Sono pigro da tradurre :) stat va bene per un momento per me.
CND

9
Cosa intendi con "imposta lo stesso"? Hai già un file con l'autorizzazione -rw-r - r-- e vuoi impostare un altro file con le stesse autorizzazioni? Quindi vedi se i tuoi chmodsupporti --reference: "--reference = RFILE usa la modalità RFILE invece dei valori MODE" - man chmod.
arte


Quale Unix stai usando?
Kusalananda

Risposte:


53

Si prega di controllare l' statuscita:

# 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è il trucco magico di cui hai bisogno.
dal

e la risposta è nel blocco Access qui sopra. Il file che ha usato nell'esempio ha un set di accesso diverso rispetto a quello nella domanda. quello nella domanda avrebbe mostrato Accesso: (0644 / -rw-r - r--)
nycynik

65
r=4
w=2
x=1

in ogni gruppo. Il tuo esempio è 6 (r + w = ​​4 + 2) 4 (r = 4) 4 (r = 4).


26

Il numero completo della modalità di autorizzazione è un numero ottale di 4 cifre, sebbene la maggior parte delle volte usi solo le 3 cifre meno significative. Aggiungi ogni gruppo nella stringa dei permessi, prendendo r = 4, w = 2, x = 1. Per esempio:

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

Ora, a volte vedrai una strana modifica come questa:

-rwsr-xr-T

La quarta cifra viene sovraccaricata sui xbit nel modestring. Se vedi una lettera diversa da quella xlì, significa che è impostato uno di questi "speciali" bit di quarta cifra, e se la lettera è minuscola, allora anche xquella posizione è impostata. Quindi la traduzione per questo è:

   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

Il modo UNIX standard per mostrare che un numero è ottale è avviarlo con uno zero. GNU chmodsupporrà comunque che la modalità che stai dando sia ottale, ma è più sicuro anteporre lo zero.

Infine, se vedi +a alla fine della modifica:

-rwxr-xr-x+

quindi ciò significa che il file ha autorizzazioni estese e ne avrai bisogno più di chmod. Guarda i comandi setfacle getfacl, per cominciare.


10

Questo potrebbe essere semplice

-bash-3.2$ stat --format=%a sample_file
755

3

Le autorizzazioni sono solo la rappresentazione in forma di stringa di un numero binario.
Il 0più rappresentato da -, il resto sono lettere.

di base

Per le autorizzazioni di base:

Converti tutto -e maiuscolo So Tin 0, il resto dovrebbe rappresentare 1.
Il numero binario risultante così costruito dovrebbe essere stampato come ottale:

$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

In una riga:

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

Correzione degli errori e rilevare le altre 3 bit 1000, 2000o 4000richiedono ulteriore codice:

#!/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

Ottieni l'elenco dei file con i loro valori di autorizzazione stringa e esadecimale. Mettendo% N alla fine in modo che l'output possa essere inserito in Excel più facilmente.

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'

Questo troverà tutti i file con un'autorizzazione esadecimale specifica.

find /tmp1 -user root -perm 644

-2

Per tutti i file simultanei in una Dir

-bash-4.1$ chmod -R 640 *

Per tutti i file

-bash-4.1$ chmod 640 *
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.