• 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.

Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-20 11:39 @527

Estimados,

Tengo un script el cual verifica sobre algunos archivos si el owner de éste es el usuario "root" y luego realiza una acción.

El problema que tengo es que si el archivo no existe me imprime "como acción NEGATIVA" pero no me dice cuál es su owner ya que no existe, me gustaría que en estos casos directamente no me imprima nada, ya que es erróneo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Term::ANSIColor qw(:constants);
  2. my @archivos = ("/etc/passwd", "/etc/group", "/etc/hosts", "/etc/fstab", "/etc/mtab", "/etc/inittab", "/etc/exports", "/etc/profile", "/etc/inetd.conf", "/etc/crontab", "/etc/hosts.allow", "/etc/hosts.deny", "/etc/inetd.conf", "/etc/ld.so.conf", "/etc/modules", "/etc/motd", "/etc/profile", "/etc/securetty", "/etc/syslog.conf");
  3.  
  4. foreach $varb (@archivos){
  5.  
  6. $comando = (split " ",( qx(ls -l $varb ))[0] )[2];
  7.  
  8. chomp $comando;
  9.  
  10. if ( "$comando"  eq "root" ){
  11.  
  12. print BOLD, GREEN, "Positivo:", RESET . " El archivo $varb tiene como owner root\n";
  13.  
  14.  }
  15.  
  16. else
  17.  
  18. {
  19.  
  20. print BOLD, RED, "Negativo:", RESET . " El archivo $varb tiene como owner $comando\n";
  21.  
  22. }
  23.  
  24. }
  25.  
  26. }
  27.  
  28. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Negativo El archivo /etc/inittab tiene como owner
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como ven, obtengo un resultado erróneo porque en verdad el archivo no existe. No sé cómo verificar si existe y luego comprobar quién es su owner.

Saludos.
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-20 13:06 @587

Puedes usar la función stat() o el módulo File::stat para acceder a las propiedades de cada fichero, además de los operadores -X para los atributos del fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use File::stat;
  7. use Term::ANSIColor qw(:constants);
  8.  
  9. my @archivos = qw(
  10.         /etc/crontab
  11.         /etc/exports
  12.         /etc/fstab
  13.         /etc/group
  14.         /etc/hosts
  15.         /etc/hosts.allow
  16.         /etc/hosts.deny
  17.         /etc/inetd.conf
  18.         /etc/inittab
  19.         /etc/ld.so.conf
  20.         /etc/modules
  21.         /etc/motd
  22.         /etc/mtab
  23.         /etc/passwd
  24.         /etc/profile
  25.         /etc/securetty
  26.         /etc/syslog.conf
  27.  
  28.         /home/explorer/Documents/Desarrollo/kk.pl
  29. );
  30.  
  31. for my $archivo (@archivos) {
  32.  
  33.     my $estatus = stat($archivo);
  34.  
  35.     if (! defined $estatus) {
  36.         print BOLD, RED, 'No existe ', RESET, " El archivo $archivo no existe en el sistema o no puede ser accedido\n";
  37.     }
  38.     else {
  39.         if (! -f $estatus) {
  40.             print BOLD, RED, 'No legible', RESET, " El archivo $archivo no es texto plano o no se pudo leer\n";
  41.         }
  42.  
  43.         if ( $estatus->uid == 0 ) {
  44.             print BOLD, GREEN, 'Positivo: ', RESET, " El archivo $archivo tiene como propietario a root\n";
  45.         }
  46.         else {
  47.             my ($nombre,$password,$uid,$gid,$quota,$comentario,$gcos,$dir,$shell,$expire) = getpwuid($estatus->uid);
  48.  
  49.             print BOLD, RED,   'Negativo: ', RESET, " El archivo $archivo tiene como propietario a $nombre ($uid)\n";
  50.         }
  51.     }
  52. }
  53.  
  54. __END__
  55. Positivo: El archivo /etc/crontab tiene como propietario a root
  56. Positivo: El archivo /etc/exports tiene como propietario a root
  57. Positivo: El archivo /etc/fstab tiene como propietario a root
  58. Positivo: El archivo /etc/group tiene como propietario a root
  59. Positivo: El archivo /etc/hosts tiene como propietario a root
  60. Positivo: El archivo /etc/hosts.allow tiene como propietario a root
  61. Positivo: El archivo /etc/hosts.deny tiene como propietario a root
  62. No existe El archivo /etc/inetd.conf no existe en el sistema o no puede ser accedido
  63. Positivo: El archivo /etc/inittab tiene como propietario a root
  64. Positivo: El archivo /etc/ld.so.conf tiene como propietario a root
  65. No existe El archivo /etc/modules no existe en el sistema o no puede ser accedido
  66. Positivo: El archivo /etc/motd tiene como propietario a root
  67. Positivo: El archivo /etc/mtab tiene como propietario a root
  68. Positivo: El archivo /etc/passwd tiene como propietario a root
  69. Positivo: El archivo /etc/profile tiene como propietario a root
  70. Positivo: El archivo /etc/securetty tiene como propietario a root
  71. No existe El archivo /etc/syslog.conf no existe en el sistema o no puede ser accedido
  72. Negativo: El archivo /home/explorer/Documents/Desarrollo/kk.pl tiene como propietario a explorer (1000)
Coloreado en 0.003 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: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-20 14:08 @631

Muchas Gracias.

Estoy viendo que mi salida difiere a la tuya. A mi me duplica la salida para los archivos que existe y aparte me muestra la salida del "ls".

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
No leible El archivo /etc/crontab no puede ser leido
Positivo: El archivo /etc/crontab tiene como propietario a root
No existe El archivo /etc/exports no existe en el sistema o no puede ser accedido
No leible El archivo /etc/fstab no puede ser leido
Positivo: El archivo /etc/fstab tiene como propietario a root
No leible El archivo /etc/group no puede ser leido
Positivo: El archivo /etc/group tiene como propietario a root
No leible El archivo /etc/hosts no puede ser leido
Positivo: El archivo /etc/hosts tiene como propietario a root
No leible El archivo /etc/hosts.allow no puede ser leido
Positivo: El archivo /etc/hosts.allow tiene como propietario a root
No leible El archivo /etc/hosts.deny no puede ser leido
Positivo: El archivo /etc/hosts.deny tiene como propietario a root
No leible El archivo /etc/inetd.conf no puede ser leido
Positivo: El archivo /etc/inetd.conf tiene como propietario a root
No existe El archivo /etc/inittab no existe en el sistema o no puede ser accedido
No leible El archivo /etc/ld.so.conf no puede ser leido
Positivo: El archivo /etc/ld.so.conf tiene como propietario a root
No leible El archivo /etc/modules no puede ser leido
Positivo: El archivo /etc/modules tiene como propietario a root
No leible El archivo /etc/motd no puede ser leido
Positivo: El archivo /etc/motd tiene como propietario a root
No leible El archivo /etc/mtab no puede ser leido
Positivo: El archivo /etc/mtab tiene como propietario a root
No leible El archivo /etc/passwd no puede ser leido
Positivo: El archivo /etc/passwd tiene como propietario a root
No leible El archivo /etc/profile no puede ser leido
Positivo: El archivo /etc/profile tiene como propietario a root
No leible El archivo /etc/securetty no puede ser leido
Positivo: El archivo /etc/securetty tiene como propietario a root
No existe El archivo /etc/syslog.conf no existe en el sistema o no puede ser accedido
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me dice que no pudo ser leído pero luego me da su owner.

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 explorer » 2011-01-20 19:02 @835

Depende de las propiedades y atributos de cada fichero: un fichero puede no tener puesto el atributo de lectura (no puedes abrirlo para ver su contenido), pero sí puedes saber que pertenece al root (si tienes acceso como usuario a la carpeta que lo contiene y tienes permiso para entrar en ella y ver sus contenidos).

Y si ves el contenido del ls, es porque lo estarás ejecutando.
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: Existencia de archivo y su propietario en Linux

Notapor wanako » 2011-01-20 19:38 @859

Pequeño bug:

if (! -f $estatus) {

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

Edito:
En versiones anteriores a la 5.12 no funciona el operador testeo de filas (-f -x etc) según la documentación, entonces comprobé que funciona en Strawberry Perl win32 (5.12) y no en Debian Squeeze (5.10).
No es un bug, es un módulo molesto :-)
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-20 21:16 @928

Perfecto, cambiando la variable $estatus por $archivo se soluciona.

Les hago otra consulta: si quiero verificar los permisos ¿cuál sería el valor del stat a mirar?
Muchas Gracias.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-20 22:13 @967

Encontré cómo hacer lo de los permisos; ahora voy a tener que ver cómo adaptarlo al modelo que venía armando con las acciones.

Dejo el script por si le sirve a alguien:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use File::stat;
  3. my $dir=$ARGV[0];
  4. $st = stat($dir) or die "No $dir: $!";
  5. my $stat_mode = $st->mode;
  6. my $mode = $stat_mode & 07777;
  7. printf "Actual value:%04o\n",$mode;
  8.  
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 wanako » 2011-01-20 22:24 @975

Yo adaptaría algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $permisos = sprintf "%04o", $estatus->mode & 07777;
  2. print BOLD, GREEN, "Positivo:", RESET, "Bla bla Permisos: $permisos\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para seguir usando print() y no printf(). Gustos.
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Re: Existencia de archivo y su propietario en Linux

Notapor situ » 2011-01-20 23:12 @008

Estaba probando pero no obtengo el resultado correcto :S

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


Salida:

Positivo: El archivo /etc/crontab tiene como permiso 0777
Positivo: El archivo /etc/passwd tiene como permiso 0777
Positivo: El archivo /etc/motd tiene como permiso 0777

Todos tiene 0644 menos /etc/motd.
¿Me podrías ayudar, por favor?
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-20 23:17 @012

Declara la variable como en el ejemplo que dí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $permisos = $estatus->mode & 07777; # Error
  2. my $permisos = sprintf "%04o", $estatus->mode & 07777; # Ok
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
wanako
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2010-09-23 11:27 @519

Siguiente

Volver a Administración

¿Quién está conectado?

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