系统数据文件和信息

  UNIX口令文件包含了如下图所示的个字段,这些字段包含在<pwd.h>中定义的passwd结构中。

  口令文件是/etc/passwd,而且是一个ASCII文件。每一行包含如下图所示的各字段,用冒号分隔,一般结构是

LOGNAME:PASSWORD:UID:GID:USERINFO:HOME:SHELL 

  关于这些登录项,注意下面各点:

  1. 通常有一个用户名为root的登录项,其用户ID是0(超级用户)。
  2. 加密口令字段包含了一个占位符。较早期的系统版本中,该字段存放加密口令字,将加密口令字存放在一个人人可读的文件是一个安全性漏洞。所以将加密口令字存放在另一个文件中。 
  3. 口令文件项中的某些字段可能为空。如果加密口令字段为空,这通常意味着该用户没有口令(不推荐这样做)。aquid登录项有一空白字段:注释字段。空白注释字段不产生任何影响。 
  4. shell字段包含了一个可执行程序名,被用作该用户的登陆shell。若该字段为空,则取系统默认值,通常是/bin/sh。注意,squid登录项的该字段为/dev/null。显然,这是一个设备,不是可执行文件,此时目的是,阻止任何人以用户squid的名义登陆到该系统。 
  5. 为了阻止一个特定用户登陆系统,除了使用/dev/null外,还有若干种替代方法,常见一种方法是:将/bin/false用作登陆shell。他简单的以不成功(非0)状态终止,该shell将这种终止状态判断为假。另一种常见方法是:用/bin/true禁止一个账户,他所做的一切是以成功(0)状态终止。某些系统提供nologin命令,他打印可定制的出错信息,然后以非零状态终止。 
  6. 使用nobody用户名的一个目的是,使任何人都可以登录至系统,但其用户ID和组ID不提供任何特权。该用户ID和组ID只能访问人人皆可读、写的文件。 

  提供finger(l)命令的某些支持注释字段中的附加信息。如:

#include <pwd.h>
struct passwd *getpuid(uid_t uid);//给出用户id获取口令文件项
struct passwd *getpwnam(const char *name);//给出用户名获取口令文件项
//返回值:若成功,返回指针;若出错,返回NULL

  这两个函数都返回一个指向passwd结构的指针。该结构已由这两个函数在执行时填入信息。passwd结构通常是函数内部的静态变量,只要调用任一相关函数,其内容就会被重写

  调用getpwent时,他返回口令文件的下一个记录项。每次调用此函数都重写passw结构。 函数setpwent反绕它所使用的文件,endpwent则关闭这些文件。在使用getpwent查看完口令文件后,一定要调用endpwent关闭这些文件。

#include <pwd.h>

struct passwd *getpwent(void);
//返回值:若成功,返回指针;若出错或者到达文件尾端,返回NULL

void setpwent(void);
void endpwent(void);

demo

#include <pwd.h>
#include <stddef.h>
#include <string.h>

struct passwd *getpwnam(const char *name)
{
    struct passwd *ptr;
    setpwent();
    while ((ptr = getpwent()) != NULL)
    {
        if (strcmp(name,ptr->pw_name) == 0) 
            breakl;
    }   
    endpwent();
    return ptr;
}!

猜你喜欢

转载自www.cnblogs.com/tianzeng/p/11050560.html
今日推荐