=========================
实验平台:Fedora 11
Linux平台信息:
[canlynet@dc include]$ uname -a
Linux dc 2.6.29.4-167.fc11.i686.PAE #1 SMP Wed May 27 17:28:22 EDT 2009 i686 i686 i386 GNU/Linux
Linux dc 2.6.29.4-167.fc11.i686.PAE #1 SMP Wed May 27 17:28:22 EDT 2009 i686 i686 i386 GNU/Linux
=========================
Linux系统运行时需要大量数据文件提供配置等信息。由于历史原因,这些文件都是ASCII文本文件(也就是可以用vim查看)。
Linux系统的口令文件为/etc/passwd,此口令文件包含多行类似下面的信息:
[canlynet@dc include]$ vi pwd.h
[canlynet@dc include]$ vim /etc/passwd
[canlynet@dc include]$ head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
每行都包括了7个字段,比如第一行:
1、root -- 用户名
2、x -- 加密口令(占位字符)
3、0 -- 数值用户ID
4、0 -- 数值组ID
5、root -- 注释字段
6、root -- 初始工作目录
7、/bin/bash -- 初始shell(用户程序)
再看/usr/include/pwd.h中定义的passwd结构(与之对应):
/* The passwd structure. */
struct passwd
{
char *pw_name; /* Username. */
char *pw_passwd; /* Password. */
__uid_t pw_uid; /* User ID. */
__gid_t pw_gid; /* Group ID. */
char *pw_gecos; /* Real name. */
char *pw_dir; /* Home directory. */
char *pw_shell; /* Shell program. */
};
加密口令经过单向加密算法存放在另一个文件中,这个文件不是一般用户可以读取的。
shell字段指定一个可执行的程序名,如果不指定,使用默认值,通常是/bin/sh。/sbin/nologin的作用是导致登录失败。
我们知道,shell程序其实也是c语言编写的应用程序,利用I/O函数,我们完全可以读取ASCII文件中每一行代码,也可以对字符串进行解析操作。