Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Permisos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Sab Sep 06, 2008 5:33 pm
ElCidJJ
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2008
Mensajes: 8
Permisos Responder citando

Hola, aquí me encuentro atrapado en este inmenso y gran mundo del perl; y no se si es por sobredosis de trabajo o por saturación de mis neuronas, que tengo una nueva duda que plantearles:

Me gustaría saber como puedo comprobar los permisos de una serie de archivos. En este caso necesito saber si unos determinados archivos no tienen los permisos de lectura y ejecución para todos los usuarios. Yo lo he intentado así:

Perl:

#Recorro el contenido de un fichero cuyo último campo es la dirección del fichero que quiero comprobar
 
#Comprobamos que las tareas tengan los permisos de lectura, ejecución y no sean un directorio

while ($linea=<MANEJADOR_FICHERO>)
                {
                        @identificador1=split / /,$linea;


#$identificador1[6] Contiene la direccion relativa de los ficheros a comprobar
#                   print("$identificador1[6]\n");

                        if (!(-r './'.$identificador1[6] and -x './'.$identificador1[6] and -d './'.$identificador1[6]))
                        {
#GUardo en un vector la linea donde está ese fichero que no tiene los permisos necesarios
                                $vector_de_permisos[$posicion_permisos] = $identificador1[0];
                                $bandera_permisos=1;
                                $posicion_permisos++;   
                        }

...


No está bien puesto que me dicen que todos los ficheros no tienen los permisos y comprobado están que los tienen todos, excepto uno.

A ver si me podéis ayudar con esto, que no sé cómo ponerlo bien. Muchísimas Gracias.
Mensaje Sab Sep 06, 2008 5:49 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 478
Ubicación: Frente al monitor
Responder citando

Cambia ésta parte del código:
Perl:
if (!(-r './'.$identificador1[6] and -x './'.$identificador1[6] and -d './'.$identificador1[6]))

Por ésta:
Perl:
if ( not ( -r -x -d "./$identificador1[6]" ) ) { ... }


No le he probado pero en teoría funciona.

PD: Te recomiendo usar perltidy...
Mensaje Sab Sep 06, 2008 6:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Pues sí, creating021, esa última solución funciona, pero solo si estás usando el Perl 5.10: Stacked filetest operators

Por otra parte, no resuelve el problema planteado por ElCidJJ, ya que las comprobaciones de fichero -r, -x y -d se refieren a los permisos del usuario, no a los del resto de usuarios (los otros).

Ultima edición por explorer el Sab Sep 06, 2008 7:05 pm, editado 1 vez
Mensaje Sab Sep 06, 2008 6:58 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4082
Ubicación: Valladolid, España
Responder citando

Para obtener los permisos del fichero, hay que usar el tercer elemento devuelto por la función stat().

El siguiente código puede resolver el problema:
Perl:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use Fcntl ':mode';

my $fichero  = "salida.dat";
my $permisos = (stat $fichero)[2];
my $es_legible    = $permisos & S_IROTH;
my $es_ejecutable = $permisos & S_IXOTH;

#printf "Los permisos son %04o\n", $permisos & 07777;
#print "[$es_legible,$es_ejecutable]\n";

if ( !$es_legible or !$es_ejecutable ) {
    print "No es legible o no es ejecutable\n";
}

__END__

Un poco de lógica booleana:
Perl:
if ( !$es_legible or !$es_ejecutable ) {
es lo mismo que
Perl:
if ( !($es_legible and $es_ejecutable) ) {


Más información: perldoc -f stat
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group