Necesito establecer el mismo chmod, ¿cómo obtener el número para -rw-r - r-- ?
chmod
soportes --reference
: "--reference = RFILE usa el modo RFILE en lugar de los valores MODE" - man chmod.
Necesito establecer el mismo chmod, ¿cómo obtener el número para -rw-r - r-- ?
chmod
soportes --reference
: "--reference = RFILE usa el modo RFILE en lugar de los valores MODE" - man chmod.
Respuestas:
Por favor verifique la stat
salida:
# 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
es el truco de magia que necesitas
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 x
bits de la cadena de modo. Si ve una letra distinta de x
allí, significa que uno de estos bits "especiales" de cuarto dígito está configurado, y si la letra está en minúscula, entonces x
tambié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 chmod
asumirá 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 setfacl
y getfacl
, para empezar.
Los permisos son solo la representación de cadena de un número binario.
La 0
mayoría está representada por -
, el resto son letras.
Para permisos básicos:
Convierta todos -
y mayúsculas S
o T
to 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
, 2000
o 4000
requiere 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))"
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