如何读取linux etc / passwd文件并比较C中用于身份validation的用户输入名称

这是我写的程序,任何人都可以告诉它有什么问题,因为无论我给出什么输入,它都显示有效的用户。

#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); } } 

你能用getpwent做这个任务吗?

请参阅: getpwent(3)和opengroup的getpwent

  • 这是一个使用的通用示例 ,和
  • 这是另一个 – 如何查找用户 。

  • 这是关于该主题的Stackoverflow讨论

问候

RBO

strcmp是一个三向比较器。 它告诉您字符串是否相等,或者第一个字符串是否按字典顺序小于或大于秒。

因此,当用作booelan值时,其结果有点不直观。 它在字符串匹配时返回0 ,在if语句中计算结果为false。 当字符串不同时,它返回非零值,通常为-1或1(所有值都为true)。

如果要测试两个字符串是否相同,则应更改

 if(strcmp(line,username)) 

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

另请注意Starkey关于/etc/passwd中行的额外内容的答案。 如果您只进行上述更改,您的程序将始终返回“非有效用户”。

您可能希望使用getpwnam而不是尝试手动解析/etc/passwd

如果两个字符串完全等价,则strcmp返回0(这是假),如果字符串完全不同,则strcmp返回非零数字(这是真的)。

首先,您似乎错误地使用了if-test。 其次,您需要只测试前n字符,其中n是用户名的长度。 在我的头顶,我建议你尝试用以下方法替换你的if-test:

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

strcmp将passwd文件中的整行与您输入的内容进行比较。 passwd文件不仅包含每行的用户名(查看passwd文件以查看我在说什么)。

除了你的strcmp测试条件是错误的,正如其他人已经指出的那样,passwd文件中的行不仅包含用户名。 您可以使用strstr查看该名称是否存在于特定行中。

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