¿Cómo puedo obtener permisos de archivos octales desde la línea de comandos?

313

Hay un comando chmod para configurar permisos de archivos, pero ¿puedo obtener permisos de archivos en modo octal (como 755) desde la línea de comandos?

    
pregunta Anwar 17.06.2012 - 10:04

6 respuestas

447

Puedes probar

stat -c "%a %n" *

Reemplaza * con el directorio relevante o el nombre de archivo exacto que deseas examinar.

De la página man de stat ,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

Uso:

  • Con archivos:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Con carpetas:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(Referencia)

    
respondido por el jokerdino 17.06.2012 - 10:08
37

Los permisos de archivos en Linux se pueden mostrar en formato octal usando el comando de estadísticas de Linux.

Simplemente presione Ctrl + Alt + T en su teclado para abrir Terminal. Cuando se abre, navega al directorio donde deseas encontrar los permisos del archivo en modo octal.

stat -c '%A %a %n' *

% A Derechos de acceso en forma legible para humanos

% a Derechos de acceso en octal

% n Nombre de archivo

  

Números y permisos octales

     

Puedes usar el número octal para representar el modo / permiso:

r: 4
w: 2
x: 1
     

Por ejemplo, para el propietario del archivo puede usar el modo octal de la siguiente manera. Leer,   escribir y ejecutar permiso (completo) en un archivo en octal es 0 + r + w + x =   0 + 4 + 2 + 1 = 7

     

Solo el permiso Leer y escribir en un archivo en octal es 0 + r + w + x = 0 + 4 + 2 + 0   = 6

     

Solo el permiso de lectura y ejecución en un archivo en octal es 0 + r + w + x =   0 + 4 + 0 + 1 = 5

     

Usa el método anterior para calcular permisos para grupos y otros. Nos deja   diga que desea otorgar permiso completo al propietario, lea & amp; ejecutar   permiso para agrupar y leer solo permisos para otros, entonces necesitas   para calcular el permiso de la siguiente manera: Usuario = r + w + x = 0 + 4 + 2 + 1 = 7 Grupo =   r + w + x = 0 + 4 + 2 + 0 = 6 Otros = r + w + x = 0 + 0 + 0 + 1 = 1

     

El permiso efectivo es 761.

Fuente: enlace

    
respondido por el Mitch 17.06.2012 - 10:14
33

Según lo detallado en permisos de estilo "755" con 'ls' por Adam Courtemanche en AgileAdam.com , puede crear un alias lso que actúa como ls -l pero procesa ligeramente la salida 1 para mostrar los permisos también en octal. Esto agrega una columna principal que muestra tres dígitos 2 permisos octales. Como está escrito, esto funciona para la mayoría de los archivos y directorios, pero no funciona correctamente si el adhesivo o setuid/setgid bits están establecidos. 3

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

Sin embargo, esto tiene una deficiencia seria, como techtonik señala . Usted no puede pasar argumentos a este lso alias como lo haría con el comando ls , porque se toman como argumentos adicionales a awk en su lugar. Por lo tanto, no puede ejecutar lso en un archivo o directorio específico, ni puede pasar ninguna opción (como -F o --color ) a lso .

La solución consiste en definir lso como una función en lugar de un alias.

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Si está probando esto interactivamente en su shell, ejecute unalias lso para eliminar el alias; puede hacerlo antes o después de definir la función. Si lo está colocando en un archivo de origen, como ~/.bashrc , simplemente elimine la línea alias y agregue la definición de la función.

¿Por qué funciona esto? A diferencia de los alias, las funciones de shell bash pueden tomar parámetros posicionales , es decir, argumentos de línea de comandos . "$@" se expande a la lista de argumentos completa , lo que genera argumentos para lso función que se pasará a ls . (A diferencia de una definición de alias, el cuerpo de una función no se cita, por lo tanto, era necesario eliminar los caracteres \ antes de $ y " .)

Dado que puede pasar opciones a lso cuando se define de esta manera como una función, puede eliminar las opciones -a y -G de la definición; puede pasarlas manualmente en los casos en que las desee. . ( Se requiere la opción -l para obtener más información al igual que los permisos de archivos que se mostrarán en absoluto , por lo que no hay beneficio en eliminarlos).

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Gracias a techtonik por señalando la limitación al definir lso como alias, lo que me motivó a expanda esta publicación con material sobre cómo convertirla en una función en su lugar.

1 Se puede observar que esto parece burlar la regla general sobre no analizando la salida de ls . ls produce una salida legible por humanos; esto introduce idiosincrasias y limitaciones, por lo que generalmente no es adecuado como entrada para otros comandos. En este caso analizamos ls porque deseamos conservar el comportamiento exacto de ls , excepto nuestro uno cambio agregado.

2 Una de las limitaciones de este alias, que también se aplica a la versión de la función que se muestra debajo, y que puede considerarse un error, es que solo muestra tres dígitos octales incluso cuando el cuarto dígito octal es cero. Como jfmercer tiene correctamente señalado , los dígitos octales que se muestran aquí no reflejan el bit adhesivo si está presente, ni los bits setuid o setgid.

3 Más grave que simplemente no mostrar el cuarto dígito octal es que este método asume que no están establecidos, y < strong> si lo son - si ves t , s o S en la cadena de permisos - entonces debes ignorar los dígitos octales . Esto porque los bits se deducen de la cadena de permisos de una manera que no tiene en cuenta los bits setuid / setgid fijos.

    
respondido por el Eliah Kagan 17.06.2012 - 10:12
17

Simplemente ampliando \ simplificando respuestas relacionadas con 'estadísticas' anteriores:

Simplemente puede ejecutar:

stat <path_to_file>

La salida contendrá permiso octal junto con otra información.



Detalles (versión de estadísticas y ejemplo):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: '/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

Tenga en cuenta lo siguiente: ( 0644 / - rw-r - r -)

    
respondido por el Vano 26.08.2015 - 18:07
6

Para la portabilidad, puede usar perl :

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

Si quiere saber cuándo ocurre un error, intente:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
    
respondido por el cuonglm 21.09.2014 - 17:30
2

Puedes usar find con la acción -printf .

ls no muestra permisos octales, pero puede usar esta solución alternativa find :

find path -printf "%m:%f\n"

Por ejemplo, para consultar mi directorio de videos:

$ find Videos -printf "%m:%f\n"
755:Videos

El especificador de formato %m le dice a la acción -printf para imprimir permisos octales, mientras que el especificador de formato %f hace que imprima el nombre de archivo.

Puede pasar múltiples nombres de archivo a find . Incluso puedes usar globs (por ejemplo, find * -printf "%m:%f\n" ).

No tiene que usar una prueba como -name o -iname ; es suficiente para pasar los nombres de los archivos o directorios que le interesan como puntos de partida a find . Es decir, proporcione sus nombres como argumentos inmediatamente después de la palabra find , como se muestra arriba.

find le da un gran control sobre cómo muestra la salida. En particular, hay dos modificaciones que pueden serle útiles:

  • De forma predeterminada, find recurre subdirectorios, similar a ls -R . Si no desea que find visite los subdirectorios de los puntos de inicio que le pasa, puede agregar -maxdepth 0 (o use -maxdepth con otros valores para indicar qué tan profundo desea que vaya).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f solo muestra un nombre de archivo, por lo que si find tiene que recurrir para acceder a un archivo, es posible que no sepa dónde está ubicado. Para mostrar una ruta, comenzando con el punto de partida en el que se encuentre el archivo, use %p en su lugar.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

Consulte man find para obtener más información sobre el uso del find comando.

Otro método ( ls y awk )

Esto se puede usar para enumerar todos los archivos de directorio con sus permisos:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Este es esencialmente el mismo comando que en % alias lso de Adam Courtemanche , que que responde citado, simplemente ejecute como un solo comando. Si solo está usando esto una vez, o en raras ocasiones, es posible que no desee molestarse en escribirlo como un alias o función de shell.

    
respondido por el Maythux 07.03.2014 - 08:16

Lea otras preguntas en las etiquetas