Linux系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行操作。
首先我们来打开这个文件,看看到底包含那些类容,执行命令如下:
[root@hmy ~]# 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
operator:x:11:0:operator:/root:/sbin/nologin
可以看到,/etc/passwd/ 文件中的内容非常规律,每行记录对应一个用户。
Linux系统中默认怎么会有这么多的用户?这些用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一但删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
不仅如此,每行用户信息都以 “ :”作为分隔符,划分为七个字段,每个字段所表示的含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell
接下来,逐个介绍这些字段。
用户名,就是一串代表用户身份的字符串
用户名仅是为了方便用户记忆,Linux系统是通过UID来识别用户身份,分配用户权限的。/etc/passwd 文件中就定义了用户名和UID之间的对应关系。
“x”表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中。
在早期的Unix中,这里保存的就是真正的加密密码串,但由于所有程序都能读取此文件,非常容易造成用户数据被窃取。
虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。
因此,现在Linux系统把真正的加密密码串放置在 /etc/shadow 文件中,此文件只有 root 用户可以浏览和操作,这样就最大限度的保证了密码的安全。
需要注意的是,虽然 “x” 并不表示真正的密码,但也不能删除,如果删除了 “x” ,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登录(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码)。
UID,也就是用户ID。每个用户都有唯一的一个UID,Linux系统通过UID来识别不同的用户。
实际上,UID就是一个0~65535之间的数,不同范围的数字表示不同的用户身份,下表所示:
UID范围 | 用户身份 |
---|---|
0 | 超级用户。UID为0就代表这个账号是管理员账号。在Linux中,如何把普通用户升级成管理员了?只需把用户的UID修改为0就可以了。不过不建议建立多个管理员账号。 |
1~499 | 系统用户(伪用户)。也就是说,此范围的UID保留给系统使用,其中,1~99用于系统自行创建的账号;100~499分配给有系统账号需求的用户。 其实,除了0之外,其它的UID并无不同,这里只是默认500以下的数字给系统作为保留账户,只是一个公认的习惯而已。 |
500~65535 | 普通用户。通常这些UID已经足够用户使用了。但不够用也没关系,2.6.x内核之后的Linux系统已经可以支持2的32次方个UID了。 |
全程 “Group ID” ,简称 “组ID” ,表示用户初始组的组ID号。这里解释一下初始组和附加组的概念。
初始组,指用户登录时就拥有这个用户组的相关权限。每个用户的初始组只能有一个,通常就是将和此用户的用户名相同的组名作为该用户的初始组。
附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组外,用户在加入其他的用户组,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。
当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
需要注意的是,在 /etc/passwd 文件的第四个字段中看到的ID是这个用户的初始组。
这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已。
也就是用户登录后有操作权限的访问目录,通常称为用户的主目录。
例如,root超级管理员账户的主目录为 /root,普通用户的主目录为 /home/username ,即在 /home/ 目录下建立和用户名相同的目录作为主目录,如 test 用户的主目录就是 /home/test/ 目录。
Shell就是 Linux 的命令解释器,是用户和 Linux 内核之间沟通的桥梁。
我们知道,用户登录 Linux 系统后,通过使用 Linux 命令完成操作任务,但系统只认识类似 0101 的机器语言,这里就需要使用命令解释器。也就是说,Shell 命令解释器的功能就是将用户输入的命令转换成系统可以识别的机器语言。
通常情况下,Linux 系统默认使用的命令解释器是 bash(/bin/bash),当然还有其它命令解释器,例如 sh、csh等。
在 /etc/passwd 文件中,大家可以把这个字段理解为用户登陆之后所拥有的权限。当然这里使用的是 bash 命令解释器,就代表这个用户拥有权限范围内的所有权限。例如:
[root@localhost ~]# vi /etc/passwd
test:x:502:502::/home/test:/bin/bash
我手工添加了 test 用户,它使用的是 bash 命令解释器,那么这个用户就可以使用普通用户的所有权限。
如果我把 test 用户的 shell 命令解释器修改为 /sbin/nologin ,那么,这个用户就不能登陆了,例如:
[root@localhost ~]# vi /etc/passwd
test:x:502:502::/home/test:/sbin/nologin
因为 /sbin/nologin 就是禁止登录的 Shell 。同样,如果我在这里放入的系统命令,如 /usr/bin/passwd ,例如:
[root@localhost ~]#vi /etc/passwd
test:x:502:502::/home/test:/usr/bin/passwd
那么这个用户可以登陆,但登陆之后就只能修改自己的密码。但是,这里不能随便写入和登录没有关系的命令(如ls),系统不会识别这些命令,同时也就意味着这个用户不能登录。