用户管理
用户账号#
/etc/passwd#
Linux 使用 /etc/passwd
文件来保存用户账号信息。
因为许多服务进程需要读取用户账号的信息,可以看到这个文件的权限都是可读的。
查看某个用户的账号信息。
KEY | VALUE |
---|
用户名 | kuga |
用户密码 | x |
用户 ID | 1000 |
用户组 ID | 1000 |
备注字段 | ,,, |
目录位置 | /home/kuga |
默认 Shell | /bin/bash |
系统会预留一定的 UID 范围,Ubuntu 新添加的用户 ID 从 1000 开始。
下面的命令会按第 3 个字段 UID 逆序排序,然后输出前 10 行,只显示 136 字段(用户名,UID,目录位置)。
/etc/shadow#
由于历史原因,早期的用户密码使用 /etc/passwd
存储,所以文件名是 passwd。
后来因为密码容易被暴力破解,现在的密码已经搬到新文件 /etc/shadow
。
这个文件只有 root 和 shadow 组可读。
可以粗略看看这个文件的内容。
这些字段一般都是管理密码的(如多少天后必须更改),这里不展开。
Useradd#
HOME 目录#
默认不创建用户目录。
使用 -m
参数会创建用户目录。
使用 -M
参数不会创建用户目录。
查看默认配置#
使用 -D 选项可以查看添加用户时采用的默认配置。
- GROUP:用户默认组 ID。
- HOME:用户目录位置。
- INACTIVE:密码过期后多少天禁用账号。
- EXPIRE:账号过期日期。
- SHELL:默认使用的登录 Shell。
- SKEL:Skeletal,该目录内容会复制到用户主目录。
- CREATE_MAIL_SPOOL:是否创建邮件存储文件。
/etc/default/useradd#
useradd
命令的默认配置文件。
如果把 SHELL 改成 /bin/bash
,那么 useradd -D
就会自动更新。
/etc/login.defs#
用户账号和登录管理的核心配置文件。
功能包括:密码策略、UID/GID 范围、HOME 目录管理、用户和组管理、登录设置等等。
文件中的设置会影响诸如 useradd
、usermod
、passwd
等命令的行为,修改前建议提前备份。
单独看一下 USERGROUPS_ENAB
参数。
如果 USERGROUPS_ENAB
的值为 yes:
userdel
:删除用户的时候,会同时删除空的用户用。useradd
:创建用户的时候,会同时创建和用户名一样的组。
这就是为什么上面创建用户的时候,没有使用 GROUP=100
这个默认参数。
使用命令修改配置#
修改默认登录 Shell。
修改默认组 ID。
修改默认的 HOME 目录。
执行命令后,你会发现,文件的权限从 644
-> 600
。
权限更正如下。
翻一下源码,在 set_defaults(void)
方法中,执行过程大致如下:
- 使用
mkstemp
函数创建临时文件 A。 - 处理
/etc/default/useradd
文件并复制到 A 中。 - 备份原来的
useradd
文件,重命名为 useradd-
。 - 把 A 文件覆盖原来的
useradd
文件。 mkstemp
函数创建的文件权限是 0600
。
查看 useradd
和它的备份 useradd-
。
如果使用执行命令修改默认登录 Shell。
再次查看两个文件的 inode。
不难发现 useradd-
的 inode 就是修改前 useradd
的 inode。
关于权限被修改的问题,显然是不合理的,命令不应该修改文件的权限。
在 GitHub 上可以查看这个 pull request。
Usermod#
更改用户的登录名#
将用户添加到一个组#
-a
表示追加到组,而不是替换当前组列表。
更改用户的默认 Shell#
usermod
不会检查 Shell 的合法性,可用 chsh
代替。
更改用户 ID#
Passwd#
修改当前用户的密码#
不加参数就是修改当前用户的密码。
修改指定用户的密码#
登录管理#
禁止密码登录#
下面两种方法是一样的,而且不会禁止 SSH 公钥认证。
执行后,/etc/shadow
文件的密码字段前面会加 !
。
恢复密码登录#
下面两种方法是一样的,可以混着用。
执行后,/etc/shadow
文件的密码字段前面会删除 !
。
禁止 SSH 公钥认证#
没有了登录 Shell,自然密码也是不能登录。
恢复 SSH 公钥认证#
Userdel#
仅删除用户#
这种方法只删除用户,保留主目录。
主目录和邮件#
不但删除用户,还要删除主目录和邮件。
如果文件或目录没不存在,会在终端提示。
Adduser Package#
这个包提供两个实用命令,adduser
和 deluser
,属于上层封装好的工具。