Cómo obtener el número de permiso por cadena: -rw-r - r--

53

Necesito establecer el mismo chmod, ¿cómo obtener el número para -rw-r - r-- ?

cnd
fuente
2
Programáticamente o solo necesitas saber cómo traducir?
mattdm
Soy perezoso para traducir :) stat está bien por un momento para mí.
cnd
99
¿Qué quieres decir con "establecer lo mismo"? ¿Ya tiene un archivo con el permiso -rw-r - r-- y desea configurar otro archivo con los mismos permisos? Luego vea si sus chmodsoportes --reference: "--reference = RFILE usa el modo RFILE en lugar de los valores MODE" - man chmod.
Manatwork
¿Qué Unix estás usando?
Kusalananda

Respuestas:

53

Por favor verifique la statsalida:

# 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: -
lik
fuente
11
stat -c %a /path/to/filees el truco de magia que necesitas
fromnaboo
y la respuesta está en el bloque de Acceso allí arriba. El archivo que utilizó en el ejemplo tiene un conjunto de acceso diferente al de la pregunta. el de la pregunta habría mostrado Acceso: (0644 / -rw-r - r--)
nycynik
65
r=4
w=2
x=1

en cada grupo Su ejemplo es 6 (r + w = ​​4 + 2) 4 (r = 4) 4 (r = 4).

Jan Marek
fuente
26

El número de modo de permisos completo es un número octal de 4 dígitos, aunque la mayoría de las veces, solo usa los 3 dígitos menos significativos. Sume cada grupo en la cadena de permisos, tomando r = 4, w = 2, x = 1. Por ejemplo:

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

Ahora, a veces verás una cadena de modos extraña como esta:

-rwsr-xr-T

El cuarto dígito se sobrecarga en los xbits de la cadena de modo. Si ve una letra distinta de xallí, significa que uno de estos bits "especiales" de cuarto dígito está configurado, y si la letra está en minúscula, entonces xtambién se establece esa posición. Entonces la traducción para este es:

   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

La forma estándar de UNIX de mostrar que un número es octal es comenzar con un cero. GNU chmodasumirá que el modo que le está dando es octal de todos modos, pero es más seguro anteponer el cero.

Finalmente, si ve un +al final de la cadena de modo:

-rwxr-xr-x+

entonces eso significa que el archivo tiene permisos extendidos, y necesitará más que eso chmod. Mira en los comandos setfacly getfacl, para empezar.

Jander
fuente
10

Esto podría ser sencillo

-bash-3.2$ stat --format=%a sample_file
755
Sridhar
fuente
3

Los permisos son solo la representación de cadena de un número binario.
La 0mayoría está representada por -, el resto son letras.

básico

Para permisos básicos:

Convierta todos -y mayúsculas So Tto 0, el resto debe representar 1.
El número binario resultante así construido debe imprimirse como octal:

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

En una linea:

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

Corrección de errores y detección de los otros 3 bits 1000, 2000o 4000requiere más código:

#!/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))"
Flecha
fuente
0

Obtenga la lista de archivos con sus valores de cadena y permiso hexadecimal. Poner% N al final para que la salida se pueda poner en Excel más fácilmente.

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'

Esto encontrará todos los archivos con un permiso hexadecimal específico.

find /tmp1 -user root -perm 644
MacGyver
fuente
-2

Para todos los archivos concurrentes en un Dir

-bash-4.1$ chmod -R 640 *

Para todos los archivos

-bash-4.1$ chmod 640 *
shekar
fuente