用户信息 /etc/passwd,getuid(),getpwuid()
来源: ChinaUnix博客  作者: 发布时间:2007-01-01 17:03:00


Unix系统的基本用户数据库是文本文档,/etc/passwd (叫口令文档),他列出任何有效用户名及其相关信息。文档的每个用户一行,分为用:分隔的7个域:
  • 用户名
  • 加密格式的口令
  • 数字的user id
  • 数字的group id
  • 全名或帐户的其他说明
  • 家目录
  • 登录shell(登录时运行的程式)

    除了著名的init 程式以外,任何的Linux程式都是由其他程式或用户启动的。我们将在第11章对运行中的程式或进程的交互进行更深入的学习。用户通常是在一个响应他们命令的shell中启动程式。我们已看到,程式能够通过检查环境变量和读取系统时钟来在很大程度上了解他所处的运行环境。程式也能够发现他的使用者的相关信息。
    当一个用户要登录Linux系统时,他或她有一个用户名和密码。一旦用户名和密码通过验证,用户就能够进入一个shell。从内部原理来说,用户更有一个唯一的用户标识符UID。Linux运行的每个程式实际上都是被某个用户运行的,因此都有一个关联的UID。
    您能够对程式进行配置,让他们的运行看上去似乎是由另一个用户启动的。当一个程式的SUID权限被置位时,他的运行就似乎是由该可执行文档的属主启动的。当su命令被执行时,程式的运行就似乎他是由终极用户启动的,他随后验证用户的访问权限,将UID改为目标账户的UID值并执行该账户的登录shell。采用这种方式还能够允许一个程式的运行就似乎是由另一个用户启动的,他经常被系统管理员使用来执行一些维护任务。
    既然UID是用户身份的关键,我们就从他开始吧。
    UID有他自己的类型??uid_t,他定义在头文档sys/types.h中。他通常是个小整数。有些UID是系统预定义的;其他的则是系统管理员在添加新用户时创建的。一般情况下,用户的UID值都大于100。

    getuid函数返回程式关联的UID,他通常是启动程式的用户的UID。
    getlogin函数返回和当前用户关联的登录名。
    系统文档/etc/passwd包含一个用户账户数据库。他由行组成,每行对应一个用户,包括用户名、加密口令、用户标识符(UID)、组标识符(GID)、全名、主目录和默认shell。下面是个示例行:
    neil:zBqxfqedfpk:500:100:Neil Matthew:/home/neil:/bin/bash
    假如编写一个程式,他能确定启动他的用户的UID,我们就能够再对他进行扩展,让他查找密码文档以找到用户的登录名和全名。但我们并不推荐这种做法,因为为了改善系统的安全性,现代的类UNIX系统都不再使用简单的密码文档了。许多系统,包括Linux,都有一个使用“shadow密码”文档的选项,原来的密码文档中不再包含任何有用的加密口令信息(这些信息通常存放在/etc/shadow文档中,这是个普通用户不能读取的文档)。因此,人们定义了一组函数以提供一个标准而又有效地获取用户信息的编程接口。

    密码数据库结构passwd定义在头文档pwd.h中,他包含表4-4中的成员。
    表  4-4
    passwd成员
    说    明
    char *pw_name
    用户登录名
    uid_t pw_uid
    UID编号
    gid_t pw_gid
    GID编号
    char *pw_dir
    用户主目录
    char *pw_gecos
    用户全名
    char *pw_shell
    用户默认shell
    有些UNIX系统可能对用户全名字段使用一个不同的名字,在某些系统(如Linux)上,他是pw_gecos,而在其他系统上,他是pw_comment。这意味着我们不能对他给出一个统一的用法。
    getpwuid和getpwnam函数都返回一个指针,该指针指向和某个用户对应的passwd结构。这个用户通过getpwuid的UID或通过getpwnam的用户登录名来确定。出错时,他们都返回一个空指针并配置errno。
    实验:用户信息
    下面的程式user.c从密码数据库中提取出一些用户信息:


    他给出如下的输出,在不同的Linux和UNIX版本中,输出结果可能会稍有差异:


    实验解析
    这个程式先调用getuid来获得当前用户的UID。再把这个UID用在getpwuid函数中来获得密码文档中保存的周详信息。此外,我们还演示了通过在getpwnam中给出用户名root来获得用户信息的方法。
    假如读者查看Linux的源代码,就能在id命令的源代码中看到另一个使用getuid函数的例子。
    假如要扫描密码文档的任何信息,我们能够使用getpwent函数。他的作用是取出连续的文档数据项:


    getpwent函数依次返回每个用户的信息数据项。当到达文档尾时,他返回一个空指针。假如已扫描了足够多的数据项,我们能够使用endpwent函数来终止处理过程。setpwent函数重置读指针到密码文档的开始位置,这样下一个getpwent调用将重新开始一个新的扫描。这些函数的操作方式和我们在第3章讨论的目录扫描函数opendir、 readdir和closedir很相似。
    (有效的和实际的)用户和组标识符还能够被其他一些不太常用的函数获得:

    组标识符和有效用户标识符的周详资料请参考系统的使用手册,虽然您可能会发现自己根本无需对他们进行处理。


  • 喜欢本文,那就收藏到:

      Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
    相关评论  我也要评论
    还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅
    Jordan Shoes christian audigier wholesale Nike air Jordan Jordan retro shoes wholesale Nike Shoes Wholesale Shoes Wholesale clothing