• Publicidad

Imprimir por pantalla grupos recibiendo la GID o el nombre

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor DarkTima » 2011-05-02 13:12 @591

¡Hola!

Soy nueva en el foro y estos últimos días estoy dando vueltas por esta página para realizar, por así decirlo, una minishell.

Me ha ayudado mucho en varias cosas, pero ahora me he quedado atascada en una función.

Consiste en una función que debe mostrar por pantalla el nombre de los grupos secundarios y primarios al recibir el nombre de un grupo principal (GID).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Ya hemos abierto los ficheros /etc/group y los ficheros
  2. # /etc/passwd y ahora procederemos a hacer la búsqueda a lo largo
  3. # de los ficheros (es un trozo de código que muestra los grupos #primarios)...
  4. foreach $group (@grupo) {
  5.     @nombre_GID = split ':', $group;
  6.     if ( $nombre_GID[0] == $usuario ) {
  7.         foreach (@linea) {
  8.             @campos = split ':', $_;
  9.             if ( $priv_sec eq "-p" ) {
  10.                 if ( $campos[3] eq $nombre_GID[2] ) {
  11.                     print "  $campos[0]  $campos[2]   primario\n";}}
  12.  
  13. ...
  14. ...
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Creo que el error está en la línea 10. Esa comparación no me imprime por pantalla los grupos primarios.

Me gustaría saber cuál sería la comparación correcta, ya que creo que tengo un error de concepto más que de saber programar Perl.

¡Saludos y gracias por adelantado! :D
DarkTima
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-05-02 12:54 @579

Publicidad

Re: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor explorer » 2011-05-02 13:53 @620

Bienvenida a los foros de Perl, DarkTima.

Como el programa no está completo, es algo difícil de adivinar lo que hace. Por ejemplo, no tengo claro lo que contiene @lineas.

Lo que sí puedes hacer es usar Data::Dumper o un simple print(), que vaya sacando en pantalla el contenido de las variables, y así sabrás qué es lo que va leyendo.

Por ejemplo,

print "[$campos[3]]\n";

Observa los corchetes: son importantes para saber, exactamente, qué contiene ese elemento. Así sabrás por qué no funciona la comparación.
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: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor DarkTima » 2011-05-02 14:08 @631

Antes que nada, ¡gracias por responder!

He ido haciendo eso con cada uno de los bucles y condiciones, pero es justo aquí:

if ( $campos[3] eq $nombre_GID[2] )

donde el programa no escribe lo que deseo.

@lineas contiene cada una de las líneas del fichero passwd.

Tal y como tengo el programa, me escribe del fichero passwd los campos 0 (que contiene el nombre), los campos 2 (que contiene el UID) y la palabra "primario" de todas las líneas que tiene el fichero.

Creo que la única manera para que compare los GID de ambos ficheros es con la condición anterior, ¿no?

Haciendo print() parece ser que $campos[3] contiene todos los GID de esos grupos repetidos tantas veces como líneas hay... no sé cómo podría solucionarlo, ya que la estructura la veo correcta para poder buscar los grupos primarios y secundarios.
DarkTima
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-05-02 12:54 @579

Re: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor explorer » 2011-05-02 16:50 @743

Veo dos cosas...

En la línea 6 pone
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     if ( $nombre_GID[0] == $usuario ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero resulta que, tanto el primer campo del fichero grupos, como, suponemos, el nombre del usuario, son cadenas de caracteres, por lo que el comparador '==' es erróneo, ya que ese es el comparador numérico. Si quieres hacer una comparación de igualdad entre cadenas de caracteres, debes usar 'eq'.

En la línea 10 pone
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 if ( $campos[3] eq $nombre_GID[2] ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

es justo lo contrario... estás usando 'eq' cuando estás comparando valores numéricos, por lo que tendría que usarse el operador '=='.
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: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor DarkTima » 2011-05-02 19:37 @859

¡Ohhh! ¡Qué fallo!

Muchas gracias, era exactamente ese el error ^^

Pero ahora haciendo la comparación para buscar los grupos secundarios me he dado cuenta de que tampoco realiza bien la búsqueda y esta vez no es por lo de antes xD

Sintáxis: [ Descargar ] [ Ocultar ]
  1. elsif($priv_sec eq "-s"){ 
  2.     chomp($nombre_GID[3]); 
  3.     if($campos[3] == $nombre_GID[2]){ 
  4.         print "$nombre_GID[3]  $campos[2]  secundario\n";}} 


El chomp() lo realizo para que elimine el último carácter de cada línea del fichero que lee (que sería el salto de línea) para que pueda realizar correctamente la comparación.

El resultado por pantalla es erróneo en el $campo[2] donde debería imprimir la UID correcta y me escribe otras 3 que no lo son.

¿Alguien podría decirme dónde encuentra el error de mi planteamiento?

¡Saludos!
DarkTima
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-05-02 12:54 @579

Re: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor explorer » 2011-05-02 19:57 @873

Yo es que aún no me he enterado de lo que quieres hacer... veo que comparas dos elementos, y luego que sacas por pantalla otros dos...

¿No podrías publicar dos ejemplos -cortos, 5 líneas- de los ficheros que pretendes leer, el trozo de código que realiza la operación, y la salida esperada?
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: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor DarkTima » 2011-05-03 02:31 @146

El fichero /etc/group contiene:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. ... 
  2. cdrom:x:24:usuario,ejuarez 
  3. floppy:x:25:usuario,ejuarez 
  4. audio:x:29:usuario 
  5. www-data:x:33:usuario 
  6. usuario:x:1000:prueba2 
  7. ... 


El fichero /etc/passwd contiene:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. ... 
  2. usuario:x:1000:1000:usuario,,,:../home/u/usuario:/bin/bash 
  3. ejuarez:x:1001:1000:,,,:../home/ejuarez:/bin/bash 
  4. prueba:x:1005:1000:,,,:../home/prueba:noexiste 
  5. prueba2:x:1002:1001:,,,:../home/prueba2:/bin/false2 
  6. ... 


Luego quiero que al preguntar por los grupos secundarios me aparezca:
prueba2 1002 secundario

Y lo que me aparece a mi es:
prueba2 1000 secundario
prueba2 1001 secundario
prueba2 1005 secundario
DarkTima
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-05-02 12:54 @579

Re: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor explorer » 2011-05-03 05:28 @269

¿Y qué diferencia hay entre un grupo "primario" de un grupo "secundario"?
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: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor DarkTima » 2011-05-03 09:40 @444

Los grupos secundarios son los que aparecen en el campo 4 del fichero /etc/group, mientras que los grupos primarios son los del campo 1 en el fichero /etc/passwd.
DarkTima
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-05-02 12:54 @579

Re: Imprimir por pantalla grupos recibiendo la GID o el nombre

Notapor explorer » 2011-05-03 10:01 @459

¡¡¡Vaya lío...!!!

Lo que tu llamas "grupos", en realidad son "usuarios" del sistema.

Los "grupos" del sistema son los campos 1º (alfabético) y 3º (numérico) del fichero /etc/group; y el campo 4º (numérico) del /etc/passwd.

Más información, en man 5 group y man 5 passwd.
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 Intermedio

¿Quién está conectado?

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

cron