这个文件中保存的就是系统中所有的用户和用户的主要信息。我们打开这个文件来看看内容到底是什么。
[root@localhost ~]# vi /etc/passwd
#查看一下文件内容
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
…省略部分输出…
这个文件的内容非常规律,每行代表一个用户。大家可能会比较惊讶,Linux 系统中默认怎么会有这么多的用户啊!这些用户中的绝大多数是系统或服务正常运行所必需的用户,我们把这种用户称为系统用户或伪用户。系统用户是不能登录系统的,但是这些用户同样也不能被删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。
现在我们就把 root 用户这一行拿出来,具体分析这个文件中的内容具体代表的含义。可以注意到,这个文件用":"作为分隔符,划分为 7 个字段,我们逐个来看具体的含义。
用户名称
第一个字段中保存的是用户名称。不过大家需要注意,用户名称只是为了方便管理员记忆,Linux 系统是通过用户 ID (UID) 来区分不同用户、分配用户权限的。而用户名称和 UID 的对应正是通过 /etc/passwd 这个文件来定义的。
密码标志
这里的"x"代表的是密码标志,而不是真正的密码,真正的密码是保存在 /etc/shadow 文件中的。在早期的 UNIX 中,这里保存的就是真正的加密密码串,但是这个文件的权限是 644,查询命令如下:
[root@localhost ~]# ll /etc/passwd
-rw-r–r-- 1 root root 1648 12月29 00:17 /etc/passwd
所有用户都可以读取 /etc/passwd 文件,这样非常容易导致密码的泄露。虽然密码是加密的,但是采用暴力破解的方式也是能够进行破解的。所以现在的 Linux 系统把真正的加密密码串放置在影子文件/etc/shadow中,而影子文件的权限是 000,查询命令如下:
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1028 12月29 00:18 /etc/shadow
这个文件是没有任何权限的,但因为我是 root 用户,所以读取权限不受限制。当然,用强制修改的方法也是可以手工修改这个文件的内容的。只有 root 用户可以浏览和操作这个文件,这样就最大限度地保证了密码的安全。
所以在 /etc/passwd 中只有一个"x"代表用户是拥有密码的,我们把这个字段称作密码标志,具体的密码要去 /etc/shadow 文件中查询。但是这个密码标志"x"也是不能被删除的,如果删除了密码标志"x",那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(当然只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。
UID
第三个字段就是用户 ID(UID),我们已经知道系统是通过 UID 来识别不同的用户和分配用户权限的。这些 UID 是有使用限制和要求的:
0:超级用户 UID。如果用户 UID 为 0,则代表这个账号是管理员账号。在 Linux 中如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。
1~499:系统用户(伪用户)UID。这些 UID 是系统保留给系统用户的 UID,也就是说 UID 是 1~499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中,1~99 是系统保留的账号,系统自动创建;100~499 是预留给用户创建账号的。
500~65535:普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 65535。
这些用户足够使用了,但是如果不够也不用害怕,2.6.x 内核以后的 Linux 系统用户 UID 已经可以支持 232 个用户了。
GID
第四个字段就是用户的组 ID(GID),也就是这个用户的初始组的标志号。这里需要解释一下初始组和附加组的概念。
所谓初始组,指用户一登陆录就立刻拥有这个用户组的相关权限。每个用户的初始组只能有一个,一般就是将和这个用户的用户名相同的组名作为这个用户的初始组。举例来说,我们手工添加用户 lamp,在建立用户 lamp 的同时就会建立 lamp 组作为 lamp 用户的初始组。
所谓附加组,指用户可以加入多个其他的用户组,并拥有这些组的权限。每个用户只能有一个初始组,除初始组要把用户再加入其他的用户组外,这些用户组就是这个用户的附加组。附加组可以有多个,而且用户可以有这些附加组的权限。
举例来说,刚刚的 lamp 用户除属于初始组 lamp 外,我又把它加入了 users 组,那么 lamp 用户同时属于 lamp 组、users 组,其中 lamp 是初始组,users 是附加组。当然,初始组和附加组的身份是可以修改的,但是我们在工作中不修改初始组,只修改附加组,因为修改了初始组有时会让管理员逻辑混乱。
需要注意的是,在 /etc/passwd 文件的第四个字段中看到的 ID 是这个用户的初始组。
用户说明
第五个字段是这个用户的简单说明,没有什么特殊作用,可以不写。
家目录
第六个字段是这个用户的家目录,也就是用户登录后有操作权限的访问目录,我们把这个目录称为用户的家目录。
超级用户的家目录是 /root 目录,普通用户在 /home/ 目录下建立和用户名相同的目录作为家目录,如 lamp 用户的家目录就是 /home/lamp/ 目录。
登录之后的Shell
Shell 就是 Linux 的命令解释器。管理员输入的密码都是 ASCII 码,也就是类似 abcd 的英文。但是系统可以识别的编码是类似 0101 的机器语言。Shell 的作用就是把 ASCII 编码的命令翻译成系统可以识别的机器语言,同时把系统的执行结果翻译为用户可以识别的 ASCII 编码。Linux 的标准 Shell 就是 /bin/bash。
在 /etc/passw 文件中,大家可以把这个字段理解为用户登录之后所拥有的权限。如果写入的是 Linux 的标准 Shell,/bin/bash 就代表这个用户拥有权限范围内的所有权限。例如:
[root@localhost ~]# vi /etc/passwd
lamp❌502:502::/home/lamp:/bin/bash
我手工添加了 lamp 用户,它的登录 Shell 是 /bin/bash,那么这个用户就可以使用普通用户的所有权限。如果我把 lamp 用户的 Shell 修改为 /sbin/nologin,例如:
[root@localhost ~]# vi /etc/passwd
lamp❌502:502::/home/lamp:/sbin/nologin
那么这个用户就不能登录了,因为 /sbin/nologin 就是禁止登录的 Shell。这样说明白了吗?如果我在这里放入的系统命令,如 /usr/bin/passwd,例如:
[root@localhost ~]#vi /etc/passwd
lamp❌502:502::/home/lamp:/usr/bin/passwd
那么这个用户可以登录,但登录之后就只能修改自己的密码了。这里不能随便写入和登陆没有关系的命令,如 ls,否则系统不会识别这些命令,也就意味着这个用户不能登录。
————————————————
版权声明:本文为CSDN博主「清华大学张阳阳」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyy1659949090/article/details/88176215