Página 2 de 3

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-20 23:29 @020
por situ
Me hace lo mismo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::stat;
  3. use Term::ANSIColor qw(:constants);
  4. my @archivos = qw(
  5.        /etc/crontab
  6.        /etc/passwd
  7.        /etc/motd
  8. );
  9. for my $archivo (@archivos) {
  10.     my $estatus = stat($archivo);
  11.     $permisos = sprintf "%04o", $estatus->mode & 07777;
  12.    
  13.     if (! defined $estatus) {
  14.         print BOLD, RED, 'No existe', RESET, " El archivo $archivo no existe en el sistema o no puede ser accedido\n";
  15.     }
  16.     else {
  17.       if (! -f $archivo) {
  18.             print BOLD, RED, 'No leible', RESET, " El archivo $archivo no puede ser leido\n";
  19.         }
  20.      
  21.         if ( $permisos == 0644 ) {
  22.  
  23.             print BOLD, GREEN, "Positivo:", RESET, " El archivo $archivo tiene como permiso 0644\n";
  24.  
  25.         }
  26.  
  27.         else {
  28.  
  29.             print BOLD, RED, "Negativo:", RESET, " El archivo $archivo tiene como permiso $permisos\n";
  30.  
  31.         }
  32.  
  33.     }
  34.    
  35.      }
  36.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


salida:
Negativo: El archivo /etc/crontab tiene como permiso 0644
Negativo: El archivo /etc/passwd tiene como permiso 0644
Negativo: El archivo /etc/motd tiene como permiso 0644


:S

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 05:13 @259
por explorer
wanako escribiste:Pequeño bug:

if (! -f $estatus) {

$estatus no es texto plano, $archivo tal vez lo sea.

No, no es un error. Comprueba la sinopsis del módulo File::stat.

-f no es para comprobar filas, sino para saber si el fichero es texto plano. Quizás fuera mejor usar -r, que indica si el fichero es legible por el usuario.

Sería interesante que mostraras un ejemplo que dices que no funciona en Perl v5.10.

situ: cambia la línea 21:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         if ( $permisos == '0644' ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 08:49 @409
por situ
Anda perfecto. Muchas gracias.
Saludos.

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 14:27 @644
por wanako
explorer escribiste:No, no es un error. Comprueba la sinopsis del módulo File::stat.

-f no es para comprobar filas, sino para saber si el fichero es texto plano. Quizás fuera mejor usar -r, que indica si el fichero es legible por el usuario.

Sería interesante que mostraras un ejemplo que dices que no funciona en Perl v5.10.


Ya había escrito que no es un error, es un módulo molesto.

Depende cómo se mire todo es una fila en *nix. Lo que traté de decir es que -f comprueba que esa fila sea texto plano, pero en versiones anteriores a 5.12 no se puede usar directamente contra el objeto creado por 'stat'. Es lo que entendí al leer la documentación, además de la molestia de dejar afuera otros operadores de testeo como -t -T y -B obligándome a usar constantes de 'Fcntl'.

Imagen
Imagen

Por supuesto que en win32 modifiqué un poco el código pero se entiende, en ningún momento se cumple (! -f $status) como sucede en 5.10.

O tal vez sea un problema en mi distro con alguna librería mal actualizada, pero en perldoc dice habilitada la nueva stat() en 5.8 y en CPAN aclaran que sobreescribe funciones, anula otras y crea nuevas para la versión 5.12.

Módulo molesto :evil:

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 15:02 @668
por explorer
A ver... no puede ser "molesto" si viene incluido en la distribución base de Perl. ;)

Este módulo sobreescribe o secuestra la función del sistema stat(), para dar la posibilidad de acceder a los datos devueltos por el stat() normal, pero de una forma más cómoda, ergo deducen que quien pone un use File::stat; en su programa es porque no quiere acceder a la funcionalidad de la stat() integrada.

Lo de los problemas de versiones: hasta antes de Perl v5.12, teníamos que seguir haciendo lo que hemos hecho siempre, para comprobar si un fichero era legible, ejecutable o texto plano, era seguir usando los operadores -X. Pero a partir de Perl v5.12, eso ya se puede hacer con el propio objeto que devuelve File::stat. Así, un programa que hiciera
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fichero    = '/etc/crontab';
my($uid,$size) = (stat($fichero))[4,7];
my $es_legible = -r $fichero;
my $es_texto   = -f $fichero;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

ahora se puede reescribir así
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use File::stat;
my $fichero    = '/etc/crontab';
my $st_fichero = stat($fichero);
my $uid        = $st_fichero->uid;
my $size       = $st_fichero->size;
my $es_legible = -r $st_fichero;
my $es_texto   = -f $st_fichero;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Con lo que queda un poquito más claro (en lugar de un 4 y un 7, tenemos 'uid' y 'size', más gráficas).

Se podrían seguir usando las opciones -X sobre $fichero, desde luego, pero File::stat da una posibilidad más. No quita posibilidades.

El problema ha venido porque yo he realizado el programa en mi Perl v5.12, sin darme cuenta de que, efectivamente, los operadores -X solo funcionan en esa versión con los objetos File::stat. Así que, una de dos: o pongo un use 5.012; al principio de mi programa o, mucho mejor, adoptamos tu solución de cambiar $estatus por $archivo. ;)

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 19:10 @840
por situ
Muchas gracias. La verdad que estoy aprendiendo mucho con la ayuda de ustedes.
Tengo otro problema: si el archivo no existe el programa hace un break, parece.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::stat;
  3. use Term::ANSIColor qw(:constants);
  4. # verifico si el owner es root
  5. my @archivos = qw(
  6. /etc/crontab
  7. /etc/exports
  8. /etc/fstab
  9. /etc/group
  10. /etc/hosts
  11. /etc/hosts.allow
  12. /etc/hosts.deny
  13. /etc/inetd.conf
  14. /etc/inittab
  15. /etc/ld.so.conf
  16. /etc/modules
  17. /etc/motd
  18. /etc/mtab
  19. /etc/passwd
  20. /etc/profile
  21. /etc/securetty
  22. /etc/syslog.conf
  23. /bin/
  24. /boot/
  25. /etc/
  26. /etc/cron.daily/
  27. /etc/cron.hourly/
  28. /etc/cron.weekly/
  29. /home/
  30. /mnt/
  31. /lib/
  32. /root/
  33. /sbin/
  34. /tmp/
  35. /usr/
  36. /usr/bin/
  37. /var/
  38. );
  39. for my $archivo (@archivos) {
  40.     my $estatus = stat($archivo);
  41.     my $estatus = stat($archivo);
  42.     my $permisos = sprintf "%04o", $estatus->mode & 07777;
  43.  
  44.     if (! defined $estatus) {
  45.         print BOLD, RED, 'No existe', RESET, " El archivo $archivo no existe en el sistema o no puede ser accedido\n";
  46.     }
  47.     else {
  48.         if (! -r $archivo) {
  49.             print BOLD, RED, 'No leible', RESET, " El archivo $archivo no puede ser leido\n";
  50.         }
  51.  
  52.         if ( $estatus->uid == 0 ) {
  53.             #print BOLD, GREEN, "Positivo:", RESET, " El archivo $archivo tiene como propietario a root\n";
  54.         }
  55.         else {
  56.             my ($nombre,$password,$uid,$gid,$quota,$comentario,$gcos,$dir,$shell,$expire) = getpwuid($estatus->uid);
  57.  
  58.             print BOLD, RED,   "Negativo:", RESET, " El archivo $archivo tiene como propietario a $nombre ($uid)\n";
  59.         }
  60.  
  61.         if ( $permisos == 0644 ) {
  62.             print BOLD, GREEN, "Positivo:", RESET, " El archivo $archivo tiene como permiso 0644\n";
  63.         }
  64.         else {
  65.             print BOLD, RED, "Negativo:", RESET, " El archivo $archivo tiene como permiso $permisos\n";
  66.         }
  67.     }
  68. }
  69.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


No sé cómo continuar =( Quise juntar todo así, no tengo código de más.

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 19:41 @861
por explorer
Sí que tienes código demás... ;) la línea 40 está duplicada con la 41...

Si ejecutas desde la línea de comandos

perl -c tu-programa.pl

Perl te dirá si el programa está bien escrito o ve problemas en él.

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 19:48 @867
por situ
Me sigue sin funcionar :s

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. mgarcia@tux ~/Escritorio $ perl -c borrar.pl
  2. borrar.pl syntax OK
  3. mgarcia@tux ~/Escritorio $ perl borrar.pl
  4. Negativo: El archivo /etc/crontab tiene como permiso 0644
  5. Can't call method "mode" on an undefined value at borrar.pl line 41.
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 19:57 @873
por explorer
La línea 61 habría que cambiarla a

if ( $permisos eq '0644' ) {

Y se debería de comprobar antes si el fichero existe o no, antes de hacer el mode().

Quedaría:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $archivo (@archivos) {
  2.     my $estatus = stat($archivo);
  3.  
  4.     if (! defined $estatus) {
  5.         print BOLD, RED, 'No existe', RESET, " El archivo $archivo no existe en el sistema o no puede ser accedido\n";
  6.     }
  7.     else {
  8.         if (! -r $archivo) {
  9.             print BOLD, RED, 'No leible', RESET, " El archivo $archivo no puede ser leido\n";
  10.         }
  11.  
  12.         if ( $estatus->uid == 0 ) {
  13.             print BOLD, GREEN, "Positivo:", RESET, " El archivo $archivo tiene como propietario a root\n";
  14.         }
  15.         else {
  16.             my ($nombre,$password,$uid,$gid,$quota,$comentario,$gcos,$dir,$shell,$expire) = getpwuid($estatus->uid);
  17.             print BOLD, RED,   "Negativo:", RESET, " El archivo $archivo tiene como propietario a $nombre ($uid)\n";
  18.         }
  19.  
  20.         my $permisos = sprintf "%04o", $estatus->mode & 07777;
  21.  
  22.         if ( $permisos eq '0644' ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Existencia de archivo y su propietario en Linux

NotaPublicado: 2011-01-21 20:00 @875
por situ
Perfecto! voy a seguir con el script espero no tener que molestar, luego lo publico.
Saludos.