• Publicidad

Existencia de archivo y su propietario en Linux

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-20 23:29 @020

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.003 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
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Re: Existencia de archivo y su propietario en Linux

Notapor explorer » 2011-01-21 05:13 @259

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-21 08:49 @409

Anda perfecto. Muchas gracias.
Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Existencia de archivo y su propietario en Linux

Notapor wanako » 2011-01-21 14:27 @644

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:
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Existencia de archivo y su propietario en Linux

Notapor explorer » 2011-01-21 15:02 @668

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. ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-21 19:10 @840

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.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Existencia de archivo y su propietario en Linux

Notapor explorer » 2011-01-21 19:41 @861

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-21 19:48 @867

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
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Existencia de archivo y su propietario en Linux

Notapor explorer » 2011-01-21 19:57 @873

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
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-21 20:00 @875

Perfecto! voy a seguir con el script espero no tener que molestar, luego lo publico.
Saludos.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

AnteriorSiguiente

Volver a Administración

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado