Linux用户和组

每一个用户都有一个唯一的登录名称和一个相关联的数字标识,这个数字标识也就是我们常说的UID。每个用户既可以是一个组的成员也可以隶属于多个其他组的成员。但每一个组也都有一个唯一的名称和数字标识,这个数字标识就是我们常说的GID。

设计用户和组的IDs的主要目的有两个:一是确定系统资源隶属哪个系统用户;二是当进程访问这些系统资源时应该授予什么样的权限控制。例如,每一个文件都是属于一个特定用户和组,每一个进程都有一些用户和组IDs以确定谁拥有该进程和这些进程访问文件时所具有的什么样的权限。

本章节中,我们将探讨一些系统文件,如/etc/passwd、/etc/groupd等。这些文件里定义了系统的用户和组的信息。然后会介绍一些库函数来从这些文件中检索用户信息。结束时,我们还会介绍crypt()函数,它是用来加密和认证登录密码的。


系统的密码文件是/etc/passwd,里面包含了用户的账户信息,一行表示一个用户。每一行由半角的分号分隔共有7个字段,如

1
lavenliu:x:1000:1000:Laven Liu:
/home/lavenliu
:
/bin/bash

   

下面按顺序逐一说明每个字段的含义:

1
2
3
4
5
6
7
   
1. 用户名           - lavenliu
   
2. 加密的密码       - x
   
3. 用户UID          - 1000
   
4. 用户GID          - 1000
   
5. 用户说明         - Laven Liu
   
6. 用户家目录       - /home/lavenliu
   
7. 用户登录的shell  - /bin/bash

getpwnam函数的简单使用,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@python users_groups]# cat my_getpwnam.c 
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
 
 
int 
main(
int 
argc, 
char 
*argv[])
{
    
struct 
passwd *pwd;
 
    
if 
(argc < 2) {
        
printf
(
"Usage: %s <username>\n"
, argv[0]);
        
exit
(1);
    
}
     
    
pwd = getpwnam(argv[1]);
    
if 
(pwd == NULL) {
        
printf
(
"could not get %s record\n"
, argv[1]);
        
exit
(1);
    
else 
{
        
printf
(
"find [ %s ] record, the following is the info:\n"
, argv[1]);
        
printf
(
"Username: %s\n"
, pwd->pw_name);
        
printf
(
"Uid     : %ld\n"
, (
long
)pwd->pw_uid);
        
printf
(
"Shell   : %s\n"
, pwd->pw_shell);
    
}
     
    
return 
0;
}

编译并运行,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@python users_groups]
# gcc -g -o my_getpwnam my_getpwnam.c 
[root@python users_groups]
# ./my_getpwnam 
Usage: .
/my_getpwnam 
<username>
 
[root@python users_groups]
# ./my_getpwnam root
find 
[ root ] record, the following is the info:
Username: root
Uid     : 0
Shell   : 
/bin/bash
[root@python users_groups]
# ./my_getpwnam www
could not get www record
 
[root@python users_groups]
# ./my_getpwnam lavenliu
find 
[ lavenliu ] record, the following is the info:
Username: lavenliu
Uid     : 500
Shell   : 
/bin/bash
 
[root@python users_groups]
# ./my_getpwnam taoqi
find 
[ taoqi ] record, the following is the info:
Username: taoqi
Uid     : 517
Shell   : 
/bin/bash