• Publicidad

Permission denied en script de Perl

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Permission denied en script de Perl

Notapor Render » 2011-03-29 09:53 @453

Hola a todos,

Soy nuevo por aquí. No tengo ni idea de Perl más allá de lo que es ejecutar scripts / herramientas programadas en Perl. Tampoco suelo tener mayor problema con scripts multiplataforma que se suponen deben funcionar tanto en UNIX/Linux como en Windows. Sin embargo, tengo un script que sí me está dando quebraderos de cabeza solo en Windows.

El error que devuelve es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Reading rules...
Couldn't read . - Permission denied
 at pulledpork.pl line 528
        main::read_rules('HASH(0x252ac14)', 'C:\Documents and Settings
\Administrador/tha_rules/', 0) called at pulledpork.pl line 1803
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Donde dice, más arriba "C:\Documents and Settings\Administrador/tha_rules/" es el contenido de una variable de una archivo .conf. Da igual lo que ponga en esa variable. La variable almacena una carpeta temporal para que el script realice su trabajo:

temp_path=c:/tmp

Da igual que ponga c:/tmp que c:\tmp o cualquier carpeta, el error siempre es el mismo.

El script crea una subcarpeta tha_rules que creo es la que está dando el problema de permisos. No sé si la está creando bien o no o el problema es otro.

Yo, con mis mínimos conocimientos de Perl, he estado trasteando un poco el código, etc, pero no doy con la solución. Después de mucho mirar el código, incluso creo que funciona, pero hay una línea (528 del código):

open( DATA, "$path$file" ) || croak "Couldn't read $file - $!\n";

Ese croak()... me da que devuelve un error sin que realmente exista. Pero no estoy seguro, no soy experto en este tema.

Si alguien me puede dar una pista...

saludos y gracias,


(Adjunto el script)

Saludos y gracias,
Adjuntos
pulledpork.rar
pulledpork
(14.66 KiB) 38 veces
Render
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-03-29 07:57 @373

Publicidad

Re: Permission denied en script de Perl

Notapor explorer » 2011-03-29 10:22 @473

Bienvenido a los foros de Perl en español, Render.

El problema está aquí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if ( -d $path ) {
  2.         opendir( DIR, "$path" );
  3.         while ( defined( $file = readdir DIR ) ) {
  4.             open( DATA, "$path$file" ) || croak "Couldn't read $file - $!\n";
  5.             @elements = <DATA>;
  6.             close(DATA);
  7.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Línea a línea:
* 525: se comprueba que $path sea realmente una ruta a un directorio
* 526: se abre ese directorio. Vamos a leer los ficheros que hay dentro de él
* 527: bucle por todos los ficheros que hay dentro de $path. Cada fichero se almacena en $file
* 528: se abre el fichero "$path$file", o falla
* 529: se leen todas las líneas de $file y se pasan a @elements
* 530: se cierra la lectura de $file

El problema está en la línea 528, al intentar abrir el fichero '.' (si te fijas en el mensaje de error, es un '.' lo que está mostrando). Y '.' no es un fichero, sino la representación del directorio actual (al igual que '..' representa al directorio padre).

Esto es lo que pasa: cuando se hace un opendir(), estamos viendo los contenidos de un directorio, pero además de los ficheros que hay dentro de ese directorio, recibimos la información de los subdirectorios y de los directorios especiales que hay dentro. Es el caso de '.' y de '..'.

El fallo está en que el programa, antes de hacer el open(), no comprueba si lo que va a leer es, realmente, un fichero normal o no.

La solución es, justamente, hacer que salte a la siguiente vuelta del bucle si $file no es un fichero normal.

Inserta esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.             next if ! -f $file;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Permission denied en script de Perl

Notapor Render » 2011-03-29 11:28 @519

Muchas gracias explorer. Voy a aplicar la solución que me propone y le cuento. Por cierto, su foto me suena mucho. Dónde le habré visto...

Saludos,
Render
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-03-29 07:57 @373

Re: Permission denied en script de Perl

Notapor Render » 2011-03-29 11:42 @529

explorer, su solución funciona a la perfección. Muchísimas gracias.

Solo queda un par de cosillas respecto a permisos. Cuando ejecuto el script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. Checking latest MD5 for snortrules-snapshot-2904.tar.gz....
  2.         They Match
  3.         Done!
  4. Prepping rules from snortrules-snapshot-2904.tar.gz for work....
  5.         Done!
  6. Reading rules...
  7. Reading rules...
  8. cannot remove directory for C:/tha_rules: Permission denied at c:\pulledpork-0.6
  9. .0\pulledpork.pl line 202
  10. Setting Flowbit State....
  11.         Done
  12. Writing C:/Snort/rules....
  13. Unable to write C:/Snort/rules - Permission denied
  14.         Done
  15. Writing C:/Snort/so_rules....
  16.         Done
  17. Generating sid-msg.map....
  18.         Done
  19. Writing c:/Snort/etc/sid-msg.map....
  20.         Done
  21. Fly Piggy Fly!
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


No puede borrar:
C:/tha_rules
No puede escribir en:
C:/Snort/rules

Sin embargo, estoy ejecutando el script desde la cuenta de administrador y los permisos del sistema son correctos.

Además, muchos archivos en C:/Snort/rules tienen fecha de hoy y hora aproximada del momento de ejecución del script (17:35 hora local).

Incluso ahora que me fijo, sí ha borrado C:/tha_rules. Con lo que no entiendo el error o es que es un error que realmente no lo es...

Ahora recuerdo dónde le he visto... usted ha reseñado en este foro alguna entrada de mi blog.

Saludos,
Render
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-03-29 07:57 @373

Re: Permission denied en script de Perl

Notapor explorer » 2011-03-29 12:14 @551

Yo tampoco veo errores... quizás sea algo exclusivo de Windows. En mi Linux no veo problemas...

Yo intentaría ponerme en contacto con el autor del código, o enviar el problema al foro de este software, para ver si a alguien más le pasa lo mismo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Permission denied en script de Perl

Notapor Render » 2011-03-29 14:58 @665

Seguramente será eso, efectivamente en Linux no hay problema alguno. En su momento, hace un mes, ya reseñé este error en el foro del/los programadores pero de momento no han dado con la solución. Volveré a ver con lo visto aquí.

Muchas gracias por todo.
Render
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-03-29 07:57 @373

Re: Permission denied en script de Perl

Notapor explorer » 2011-03-29 16:51 @743

Y no tendría por qué serlo...

Si un programa está bien hecho, las pocas diferencias básicas entre Linux y Windows están en la determinación de los directorios, con los caracteres '\' (Windows) y '/' (Linux). Es más: desde hace años, ya se puede usar '/' en Windows, por lo que los problemas de compatibilidad son menores.

Otra razón pueden ser los permisos de ficheros y directorios, pero si estás como administrador, tampoco debería ser eso, pero los mensajes de error que salen ahora, así lo indican.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Permission denied en script de Perl

Notapor Render » 2011-03-30 01:31 @105

Por lo que veo, el problerma de permisos ocurre cuando escribe datos o cuando quiero borrar algo creado por el script. En la línea 202 borra la carpeta tha_rules de la forma:

my $remove = rmtree( $temp_path . "tha_rules" );

El script no devueve número de linea para el error de escritura pero supongo que debe ser la línea:

open( WRITE, ">$file" ) || print "Unable to write $file - $!\n";

Se usa rmtree y WRITE. No sé si habrá algún otro método que pudiera no devolver el error de permisos.

Saludos,
Render
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-03-29 07:57 @373

Re: Permission denied en script de Perl

Notapor Render » 2011-03-30 03:43 @197

Aparte de lo comentado anteriormente para los métodos de borrado y escritura de datos, pulledpork no es el único script de Perl que cumple la función de descarga, gestión y escritura de reglas Snort en las carpetas correspondientes. Oinkmaster también es un script de Perl que cumple esta función, aunque no es tan completo. Sin embargo oinkmaster, al ejecutarlo en Windows, no me da ningún error trabajando en las mismas carpetas que las indicadas para pulledpork, borra los temporales y escribe las nuevas reglas sin ningún problema de permisos.

Así que ahora casi que lo entiendo menos, salvo que oinkmaster (script más antiguo que pulledpork) use otros métodos de escritura y borrado.

(adjunto oinkmaster.pl)

Por otra parte, y como soy un tanto cabezota, sigo trasteando con pulledpork.pl por si descubro algo:

Una de las carpetas que debe actualizar y escribir datos dentro es so_rules. Pues bien, el script no actualiza ni escribe contenido alguno en dicha carpeta (con esta carpeta no da error de permisos pero tampoco lo hace bien), pero... si borro la carpeta, al ejecutar el script, este crea un archivo de 0 bytes con el nombre so_rules. Curioso. Esto mismo pasa con la carpeta rules (esta sí da error de permiso denegado), si la borro, el script no da error alguno aunque tampoco lo hace bien y crea un archivo rule de 0 bites.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1.         Extracted: /tha_rules/VRT-nntp.rules
  2.         Extracted: /tha_rules/VRT-dos.rules
  3.         Extracted: /tha_rules/VRT-finger.rules
  4.         Extracted: /tha_rules/VRT-phishing-spam.rules
  5.         Extracted: /tha_rules/VRT-oracle.rules
  6.         Extracted: /tha_rules/VRT-pop2.rules
  7.         Extracted: /tha_rules/VRT-bad-traffic.rules
  8.         Extracted: /tha_rules/VRT-web-cgi.rules
  9.         Reading rules...
  10.         Reading rules...
  11. cannot remove directory for C:/Snort/tmp/tha_rules: Permission denied at c:\pull
  12. edpork-0.6.0\pulledpork.pl line 202
  13. Cleanup....
  14.         removed 57 temporary snort files or directories from C:/Snort/tmp/tha_ru
  15. les!
  16. Setting Flowbit State....
  17.         Done
  18. Writing C:/Snort/rules....
  19.         Done
  20. Writing C:/Snort/so_rules....
  21.         Done
  22. Generating sid-msg.map....
  23.         Done
  24. Writing c:/Snort/etc/sid-msg.map....
  25.         Done
  26. Writing c:/Snort/etc/sid_changes.log....
  27.         Done
  28. Rule Stats....
  29.         New:-------0
  30.         Deleted:---0
  31.         Enabled Rules:----0
  32.         Dropped Rules:----0
  33.         Disabled Rules:---0
  34.         Total Rules:------0
  35.         Done
  36. Please review c:/Snort/etc/sid_changes.log for additional details
  37. Fly Piggy Fly!
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como se puede observar arriba:

Writing C:/Snort/rules....
Done
Writing C:/Snort/so_rules....
Done


Y no es cierto, además del tema de la creación de archivos 0 bites en vez de carpetas.

También se observa que si bien no puede borrar la carpeta tha_rules (carpeta que crea el propio script), sí puede borrar su contenido y de hecho sí lo hace correctamente.

Diferencias entre script Perl pulledpork y oinkmaster.

No soy entendido en Perl pero las diferencias que veo es que para crear carpetas o directorios:

- oinkmaster usa mkdir
- pulledopork usa mkpath


Saludos,
Adjuntos
oinkmaster.rar
oinkmaster
(21.69 KiB) 39 veces
Render
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2011-03-29 07:57 @373

Re: Permission denied en script de Perl

Notapor explorer » 2011-03-30 06:57 @331

mkdir() es una función interna del propio Perl, que crea un directorio.
mkpath() es una función que, hace lo mismo que mkdir(), pero además crea todos los directorios intermedios de la ruta. Así, si por ejemplo le pasas 'Snort/tha_rules/rules' creará tres niveles de directorios, uno dentro del otro. Si tuviéramos que hacerlo con mkdir(), deberíamos ejecutarlo tres veces. Esta función ha sido importada desde el módulo File::Path.

Si te crea un fichero de tamaño cero en lugar de ser un directorio, entonces ahí es donde está el problema: no está creando un subdirectorio, sino un fichero.

Por eso luego hay errores de permiso denegado: está intentando entrar en esos ficheros como si fueran subdirectorios, pero no lo son.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 24 invitados