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

时间:2010-08-25 15:50:50

标签: c

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

#include<stdio.h>
#include<string.h>
#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);
  }
}

6 个答案:

答案 0 :(得分:6)

答案 1 :(得分:3)

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

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

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

if(strcmp(line,username))

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

如果两个字符串完全等价,则

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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