2011-12-27 11 views
5

Para un archivo Unix, quiero saber si Group o World tiene permiso de escritura en el archivo.¿Cómo verificar Perl si el permiso de archivo es mayor que 755?

He estado pensando en estas líneas:

my $fpath = "orion.properties"; 
my $info = stat($fpath) ; 
my $retMode = $info->mode; 
$retMode = $retMode & 0777; 

if(($retMode & 006)) { 
    # Code comes here if World has r/w/x on the file 
} 

Gracias.

Respuesta

11

Usted está cerca con su propuesta, - el uso de stat es un poco fuera (pero pensándolo bien, debe utilizar File::stat, sino que ayuda si su código es completa), la constante de la máscara es defectuoso, y las hojas de comentario un tanto que desear:

use strict; 
use warnings; 
use File::stat; 

my $fpath = "orion.properties"; 
my $info = stat($fpath); 
my $retMode = $info->mode; 
$retMode = $retMode & 0777; 

if ($retMode & 002) { 
    # Code comes here if World has write permission on the file 
}  
if ($retMode & 020) { 
    # Code comes here if Group has write permission on the file 
} 
if ($retMode & 022) { 
    # Code comes here if Group or World (or both) has write permission on the file 
} 
if ($retMode & 007) { 
    # Code comes here if World has read, write *or* execute permission on the file 
} 
if ($retMode & 006) { 
    # Code comes here if World has read or write permission on the file 
} 
if (($retMode & 007) == 007) { 
    # Code comes here if World has read, write *and* execute permission on the file 
} 
if (($retMode & 006) == 006) { 
    # Code comes here if World has read *and* write permission on the file 
} 
if (($retMode & 022) == 022) { 
    # Code comes here if Group *and* World both have write permission on the file 
} 

la terminología en el título de la pregunta '¿Cómo comprobar si en Perl el permiso de archivo es mayor que 755? es decir, Group/World tiene permiso de escritura 'es un poco sospechoso.

El archivo puede tener permisos 022 (o, más plausiblemente, 622), y eso incluiría permisos de escritura grupal y mundial, pero no es razonable afirmar que ninguno de los dos valores sea superior a 755.

Un conjunto de conceptos que he encontrado útil es: bits de

  • Set - bits en el campo permisos que debe ser 1.
  • bits de Reset - bits en el campo permisos que deben ser 0
  • No importa los bits: bits que se pueden establecer o restablecer.

Por ejemplo, para un archivo de datos, podría requerir:

  • Set 0644 (propietario puede leer y escribir; grupo y otra puedo leer).
  • Restablecer 0133 (el propietario no puede ejecutar: es un archivo de datos; el grupo y otros no pueden escribir ni ejecutar).

más probable para un archivo de datos, que podrían requerir:

  • Set 0400 (propietario debe ser capaz de leer).
  • Restablecer 0133 (nadie puede ejecutar; el grupo y otros no pueden escribir).
  • No importa 0244 (no importa si el propietario puede escribir, no importa si el grupo u otros pueden leer).

Los directorios son ligeramente diferentes: ejecutar permiso significa que puede hacer que el directorio sea su directorio actual, o acceder a los archivos en el directorio si conoce su nombre, mientras que el permiso de lectura significa que puede encontrar los archivos en el directorio , pero no puedes acceder a ellos sin permiso de ejecución también. Por lo tanto, puede tener:

  • Conjunto 0500 (el propietario debe ser capaz de leer y usar archivos en el directorio).
  • Restablecer 0022 (grupo y otros no deben poder modificar el directorio - eliminar o agregar archivos).
  • No importa 0255 (no importa si el usuario puede crear archivos, no importa si el grupo u otro puede enumerar o usar archivos).

Tenga en cuenta que los bits de configuración y restauración deben ser disjuntos (($set & $rst) == 0)), la suma de los bits siempre será 0777; los bits "do not care" se pueden calcular desde 0777 & ~($set | $rst).

+2

Utilice las constantes de modo [Fcntl] (http://p3rl.org/Fcntl) ('S_I *') en lugar de números mágicos. – daxim

+2

Para las personas viejas como yo, las constantes son mucho más fáciles de leer que la sopa de letras de 'Fcntl'. Individualmente, las constantes son más legibles, pero 'S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH' es mucho más difícil de leer que' 0755'. Sin embargo, probablemente tenga razón en que es 'mejor estilo' usar la sopa de letras. Supongo que podría definir una constante conveniente: 'use la constante S_I755 => (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);'? (Sí, está destinado a ser una broma.) Tal vez 'use constante S_RWXR_XR_X => (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);' es más aceptable. –

-3
#!/usr/bin/perl 

use warnings; 
use strict; 

chomp (my $filename = <STDIN>); 

my $lsOutput = `ls -l $filename`; 

my @fields = split (/ /,$lsOutput); 

my @per = split (//,$fields[0]); 

print "group has write permission \n" if ($per[5] eq 'w'); 

print "world has write permission" if ($per[8] eq 'w'); 
+0

Analizar la salida de 'ls' no es confiable; ni es eficiente ni necesario. Perl tiene la funcionalidad necesaria incorporada. –

Cuestiones relacionadas