Linux 是如何辨别使用者的
每一个文件都会拥有两种属性:所有人 和 所属群组。每个登录的使用者也会去的两个 ID,一个是使用者 ID(User ID,简称 UID)和 群组 ID(Group ID,简称 GID)。
在 Linux 中,系统是根据 UID 和 GID 来辨别使用者身份的。ID 与 账号的对应关系就在 /etc/passwd 文件中。
那么文件又如何来判断它的所有者和所属群组呢,就是利用 UID 和 GID。当有需要显示文件属性时(如使用 ls -l 命令),系统会根据文件的 UID 和 GID,再到 /etc/passwd 和/etc/group 文件中找到 UID 和 GID 对应的账号和群组名显示出来。
/etc/passwd 文件的内容结构 (/etc/passwd 中存储的是系统中的所有账号信息。)
/etc/passwd中的每一行都是一个账户的信息,并用 : 来分割不同的字段,共有 7 个字段,分别是:
① 账号名称
② 密码:早期的 Unix 系统的密码就是放在这个字段上的,但是由于这个文件的特性是所有程序都能够读取,这样一来容易造成密码数据被窃取,因此后来就将密码数据放到了 /etc/shadow 中,而在 /etc/passwd 中由于不存在了密码字段,因此会用 x 来取代这个字段,并不是代表密码是 x。
③ UID:就是用来对应账号所对应的 UID的。但是 UID 的取值范围也是有一些限制的:
④ GID:这个与 /etc/group 有关,用来规范组名和 GID 的对应
⑤ 用户信息说明栏:这个字段基本上没有重要用途,知识来解释这个账号的意义
⑥ 家目录:用户的家目录,以上面的 root 账户的家目录为例,可以看到 root 用户的家目录在 /root,所以当 root 用户登入后,会自动进入 /root 目录中。其他用户默认的家目录一般在 /home/用户名
⑦ Shell:用户使用的默认 Shell
/etc/shadow 文件的内容结构 (/etc/shadow 文件中存储的是用户的密码,同时其中还加入了许多的密码限制参数)
如上图所示,/etc/shadow中的每一行都是一个账户密码信息以及其限制,并用 : 来分割不同的字段,共有 9 个字段,分别是:
① 账号名称:这里的账号名称即在 /etc/passwd 中存储的账号名称
② 密码:这个字段中的密码才是真正的密码,并且是经过了编码的密码。
③ 最近修改密码的日期:这个字段记录了最近修改密码的日期和 1970 年 1 月 1 日相距的天数。
④ 密码不可被修改的天数(与第 3 字段 最近修改密码的日期相比较):这个字段记录了这个账号的密码在最近一次呗修改后还需要经过多少天才可以再次被修改。
⑤ 密码需要重新修改的天数(与第 3 字段 最近修改密码的日期相比较):这个字段可以指定在最近一次修改密码后,在多少天内需要再次修改密码。可以强制要求用户修改密码。
⑥ 密码在需要重新修改的期限前的警告天数(与第 5 字段的密码需要重新修改的天数相比较):当账号的密码有效期快要到的时候,系统会根据这个字段的设定,发出警告言论给这个账号,提醒他:再过 n 天密码就要过期了。
⑦ 密码过期后的账号宽限时间(与第 5 字段的密码需要重新修改的天数相比较):若过了强制要求修改密码的天数后用户还没有修改密码,那么该密码就是过期了。若在密码过期几天后用户还是没有修改密码,那么这个用户的密码将会失效,即该账号无法再使用该密码登入了。
⑧ 密码失效日期:这个日期与第 3 字段一样,都是使用 1970 年 1 月 1 日以来的总日数来设定的。这个字段表示:这个账号在此字段规定的日期之后,将无法再使用,无论这个账号的密码是否过期。
⑨ 保留:最后一个字段是用来保留,留给以后的新功能。
/etc/group 文件的内容结构 (/etc/group 中记录了 GID 与 组名的对应)
如上图所示,/etc/group中的每一行都是一个群组的相关信息,并用 : 来分割不同的字段,共有 4 个字段,分别是:
① 组名
② 群组密码:通常是给群组管理员设定的,较少使用,同时与用户密码一样,群组密码已经移动到 /etc/gshadow 中去了,因此只会存在一个 x
③ GID:群组的 ID
④ 此群组支持的账号:一个账号可以加入多个群组,一个群组可以支持多个账号。当某个账号想要加入此群组时,将该账号填入这个字段即可
/etc/gshadow 文件的内容结构 (/etc/gshadow 中存放的是群组密码的相关数据。也是用 : 来分割字段,总共有 4 个字段:)
① 组名
② 群组密码:若开头为 ! 则表示无合法密码,所以无群组管理员
③ 群组管理员的账号(相关信息在 /etc/gpasswd 中)
④ 该群组支持的账号
有效群组(effective group) 与 初始群组(initial group)
初始群组
在 /etc/passwd 里面的第 4 个字段是 GID,那个 GID 就是初始群组。也就是当用户一登入系统,就立刻拥有这个群组的相关权限。
需要注意的是,一个用户的初始群组,不会在 /etc/group 中该群组的第 4 个字段(即群组支持的账号)中加入该用户账号。
若一个用户同时加入了两个群组 A 和 B,那么在读取/写入/执行 文件时,针对所属群组部分,就拥有了 A和B 这个两个群组的权限。
有效群组
但是若是想要建立一个新的文件或是新的目录,那么这个新文件的所属群组是 A 还是 B呢?这就需要看一下当时的有效群组(effective group)。
可以使用命令:groups 查看当前用户加入的所有群组,第一个输出的群组即为有效群组。若此时去建立一个新文件,那么这个文件的所属群组就是该有效群组。
可以使用命令:newgrp 群组名 来变更有效群组,但是想要切换的群组必须是当前用户已经加入了的群组。
需要注意的是,newgrp 这个指令是让使用者使用另一个 Shell 来登入,且新的 Shell 基于用户的有效 GID 就是新的群组的 GID,可以输入 exit 来回到原本的 Shell 中。
增加与删除用户
- 新建用户:useradd
useradd [选项] 用户账号名
在建立一个新的用户时,Linux 会默认帮我们做一些更新:
① 在 /etc/passwd 中建立一行与账号相关的数据
② 在 /etc/shadow 中将此账号的密码等参数填入,若只是建立,还未设密码,则为空
③ 在 /etc/group 中加入一个与账号名称一模一样的组名
④ 在 /home 地下建立一个与账号同名的目录作为用户家目录,且权限为 700
useradd -D
useradd 这些默认的设置,如:为何使用的是 /bin/bash 这个 shell等,其实都是由 useradd 所使用的参考档案来设置的。
可以使用命令:useradd -D 来查看 useradd 所使用的默认值:
- GROUP=100 : 默认的群组
- HOME=/home:默认的主文件夹所在目录
- INACTIVE=-1:密码失效日,在shadow内的第7栏
- EXPIRE=:帐号失效日,在shadow内的第8栏
- SHELL=/bin/bash:默认的shell
- SKEL=/etc/skel:使用者主文件夹的内容数据参考目录
- CREATE_MAIL_SPOOL=yes:是否主动帮使用者创建邮件信箱(mailbox)
useradd参考档
passwd:给用户设置密码 (默认情况下,使用 useradd 建立了账号后,该账号是暂时被封锁的,也就是说该账号目前还无法登入。若想登入,则还需要为用户设置一个密码。)
passwd [选项] [用户]
若是后面没有加用户,则说明是修改当前登录用户自己的密码。
■理论上,你的密码最好符合如下要求:
●密码不能与帐号相同;
●密码尽量不要选用字典里面会出现的字串;
●密码需要超过8个字符;
●密码不要使用个人信息,如身份证、手机号码、其他电话号码等;
●密码不要使用简单的关系式,如1+1=2,lamvbird 等;
●密码尽量使用大小写字符、数字、特殊字符($,_ ,等)的组合。
-
chage:修改密码参数和查看更详细的密码参数
可以使用 chage 来查看比 passwd -S 更详细的密码参数chage [选项] 账号名
可以使用命令:chage -d 0 账号名 来强制让用户在第一次登入后,必须更改密码才能使用系统资源。 -
usermod:修改用户账号的设置
usermod [选项] 用户名
-
userdel:删除用户的相关数据
userdel [-r] 用户名
若加上了 -r 选项,则连同用户的家目录也一起删除。
新增和删除群组
-
groupadd:建立群组
groupadd [选项] 群组名
-
groupmod:修改群组的某些参数
groupmod [选项] 群组名
-
groupdel:删除群组
groupdel 群组名
但是若存在某个账号的初始群组是该群组,那么该群组就无法删除。
若还是想要删除该群组,则需要先将该账号的删除,或修改该账号的 GID。 -
gpasswd:群组管理员设置
① 系统管理员 root 可使用的选项
gpasswd [选项] 群组名
使用 gpasswd 群组名 可以为该群组设置密码。
② 群组管理员可使用的选项
gpasswd [选项] 用户名 群组名