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)
.
Utilice las constantes de modo [Fcntl] (http://p3rl.org/Fcntl) ('S_I *') en lugar de números mágicos. – daxim
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. –