cómo leer un archivo linux, etc / passwd y comparar el nombre de entrada del usuario para la autenticación en C

Este es el progtwig que he escrito. Alguien puede decir qué tiene de malo, porque cualquier entrada que yo dé, muestra un usuario válido.

#include #include #define max_size 20 void main() { File *Fptr; char username[max_size]; char line[20]; if((fptr=fopen("/etc/passwd","r"))==NULL) { printf("cannot open file"); } else { fptr=fopen("/etc/passwd","r"); fputs("enter the username",stdout); fflush(stdout); fgets(username,sizeof username,stdin); while((fgets(line,sizeof(line),fptr))!=NULL) { if(strcmp(line,username)) { printf("%s valid user",username); break; } else { printf("%s not valid user",username); } } fclose(fptr); } } 

¿Podrías usar getpwent para esta tarea?

ver: getpwent (3) y getpwent de opengroup

  • Aquí hay un ejemplo genérico de uso , y
  • Aquí hay otro: cómo buscar usuarios .

y

  • Aquí está la discusión de Stackoverflow sobre el tema.

Saludos

rbo

strcmp es un comparador de tres vías. Le indica si las cadenas son iguales o si la primera cadena es lexicográficamente menor o mayor que la segunda.

Debido a esto, sus resultados son un poco intuitivos cuando se usan como valores booelan. Devuelve 0 cuando las cadenas coinciden, lo que se evalúa como falso en una sentencia if . Devuelve valores distintos de cero, generalmente -1 o 1, (todos los cuales se evalúan como verdaderos) cuando las cadenas son diferentes.

Si desea probar si dos cadenas son iguales, debe cambiar

 if(strcmp(line,username)) 

a

 if(strcmp(line,username) == 0) 

También tome nota de la respuesta de Starkey sobre el contenido adicional de las líneas en /etc/passwd . Si solo realiza el cambio anterior, su progtwig siempre devolverá “no es un usuario válido”.

En lugar de intentar analizar /etc/passwd manualmente, es posible que desee utilizar getpwnam en getpwnam lugar.

strcmp devuelve 0 (que es falso) si las dos cadenas son exactamente equivalentes, o un número distinto de cero (que es verdadero) si las cadenas difieren en absoluto.

Entonces, en primer lugar, parece que tienes tu if-test al revés. En segundo lugar, debe probar solo los n caracteres n , donde n es la longitud del nombre de usuario. Desde lo alto de mi cabeza, te sugiero que intentes reemplazar tu prueba if con:

 if (!strncmp(line, username, strlen(username)) 

strcmp compara la línea completa en el archivo passwd con lo que ha ingresado. El archivo passwd contiene más que solo el nombre de usuario en cada línea (mire el archivo passwd para ver de qué estoy hablando).

Aparte del hecho de que su strcmp prueba de strcmp es incorrecta como otros ya lo han señalado, las líneas en el archivo de contraseña contienen más que solo el nombre de usuario. Podría usar strstr para ver si el nombre está presente en una línea en particular.

 if(strstr(line, username) == line) { /* valid user */ }