接上一篇文章Linux shell编程(三): Linux 环境变量
2.4.1 Linux用户Linux安全系统的核心是用户账户。用户权限是通过创建用户时分配的用户ID(User ID,通常缩写为UID)来跟踪的。
这些信息保存在 /etc/passwd 和 /etc/shadow 文件中,关于用户账户与权限管理的内容详见 Linux用户和用户组管理相关文件内容详解
关于Linux用户的管理,Linux系统提供了以下工具:
| 命令 | 描述 |
|---|---|
| useradd | 添加新用户,默认无密码、无主目录、不指定shell版本 |
| adduser | 添加新用户,要求用户设置密码、自动创建主目录、指定shell版本 |
| userdel | 删除用户 |
| usermod | 修改用户账户的字段,还可以指定主要组以及附加组的所属关系 |
| passwd | 修改已有用户的密码 |
| chpasswd | 从文件中读取登录名密码对,并更新密码 |
| chage | 修改密码的过期日期 |
| chfn | 修改用户账户的备注信息 |
| chsh | 修改用户账户的默认登录shell |
添加新用户
useradd:命令使用系统的默认值以及命令行参数来设置用户账户。需要使用参数选项指定其他设置,如果不使用任何参数,则创建的用户无密码、无主目录、没有指定shell版本。
adduser:要求用户设置密码、自动创建主目录、指定shell版本
useradd
先讲useradd,如果不使用任何参数,执行命令 sudo useradd testuser ,则创建的用户无密码、无主目录、没有指定shell版本。
没有密码不能登录,需要后期使用 sudo passwd testuser 命令设置密码才能登录;
没有主目录就是在 /home 目录下没有该用的目录,按需设置,后期可以使用 usermod -d /testuser testuser 修改,其中 /testuser 为用户主目录, 最后的 testuser 是用户名。
没有指定shell版本会是默认的 /bin/sh shell,它的交互界面如下:
testuser用户登录后,只有一个命令提示符 $ ,要想修改登录的默认shell版本,可以使用命令 chsh -s /bin/bash testuser ,注意,修改后要重新登录该用户才能生效。
看起来有些麻烦,可以执行 useradd 命令时使用参数选项一步到位,使用参数 -p 设置密码,-m 设置主目录, -s 指定shell版本,完整命令如下:
sudo useradd testuser -p password -m -s /bin/bash
否则ueseradd命令只会根据默认值创建用户,系统默认值被设置在/etc/default/useradd文件中。可以使用useradd命令的 -D 选项查看所用Linux系统中的这些默认值,如下:
默认值含义依次为:
新用户会被添加到GID为 100 的公共组新用户的HOME目录将会位于/home新用户账户密码在过期后不会被禁用新用户账户过期日期(此处未设置)新用户账户默认shell系统会将/etc/skel目录下的内容复制到新用户的HOME目录下系统是否为该用户在mail目录下创建一个用于接收邮件的文件
其中,/etc/skel目录下是一些启动文件,如下:
如有需要,可以自定义新用户的初始文件并放到该目录下。
可以修改默认值简化创建新用户的操作,比如使用useradd命令时,不想每次指定shell版本,可以修改默认值: useradd -D -s /bin/bash ,其中 -D 代表默认值相关, -s 代表修改默认值中的shell版本,修改默认值的其他参数如下:
| 参数 | 描述 |
|---|---|
| -b default_home | 更改默认的创建用户HOME目录的位置 |
| -e expiration_date | 更改默认的新账户的过期日期 |
| -f inactive | 更改默认的新用户从密码过期到账户被禁用的天数 |
| -g group | 更改默认的组名称或GID |
| -s shell | 更改默认的登录shell |
useradd命令的其他参数选项:
| 参数 | 描述 |
|---|---|
| -c comment | 给新用户添加备注 |
| -d home_dir | 为主目录指定一个名字(如果不想用登录名作为主目录名的话) |
| -e expire_date | 用YYYY-MM-DD格式指定一个账户过期的日期 |
| -f inactive_days | 指定这个账户密码过期后多少天这个账户被禁用; 0 表示密码一过期就立即禁用, 1 表示禁用这个功能 |
| -g initial_group | 指定用户登录组的GID或组名 |
| -G group … | 指定用户除登录组之外所属的一个或多个附加组 |
| -k | 必须和 -m 一起使用,将/etc/skel目录的内容复制到用户的HOME目录 |
| -m | 创建用户的HOME目录 |
| -H | 不创建用户的HOME目录(当默认设置里要求创建时才使用这个选项) |
| -n | 创建一个与用户登录名同名的新组 |
| -r | 创建系统账户 |
| -p passwd | 为用户账户指定默认密码 |
| -s shell | 指定默认的登录shell |
| -u uid | 为账户指定唯一的UID |
adduser
和useradd类似,adduser添加新用户的命令为 sudo adduser testuser ,但adduser会引导你设置新用户的一些信息,如下:
包括新增用户组、在用户组里新增用户、创建用户的主目录、将/etc/skel目录下的内容复制到新用户的HOME目录下、设置用户登录密码、设置用户信息等。
其余设置根据默认配置文件 /etc/adduser.conf 中的内容自动设置。
删除用户
userdel
默认情况下, userdel 命令会只删除/etc/passwd文件中的用户信息,不会删除系统中属于该账户的任何文件。
如果加上 -r 参数, userdel 会删除用户的HOME目录以及邮件目录。
但用户目录中可能会有其他程序运行的必要文件,所以删除之前要检查清楚。
修改用户
usermod
usermod用于修改用户账户信息,参数选项如下:
| 参数 | 描述 |
|---|---|
| -a | 与-G一起使用,为用户添加附加组 |
| -c comment | 修改用户的说明信息(/etc/passwd 文件用户信息的第 5 个字段) |
| -d home_dir | 修改用户的主目录(/etc/passwd 文件用户信息的第 6 个字段) |
| -e expire_date | 修改用户的失效曰期(格式为 “YYYY-MM-DD”,/etc/passwd 文件用户信息的第 8 个字段) |
| -g initial_group | 修改用户的归属组编号GID(/etc/passwd 文件用户信息的第 4 个字段) |
| -u uid | 修改用户的用户编号UID(/etc/passwd 文件用户信息的第 3 个字段) |
| -G group | 修改用户的附加组,如果是为用户添加附加组,一般与-a一起使用,否则该用户的其他附加组都会删除,即修改 /etc/group 文件 |
| -l user_name | 修改用户名称(/etc/passwd 文件用户信息的第 1 个字段) |
| -L | 临时锁定用户 |
| -U | 解锁用户 |
| -s shell | 指定默认的登录shell |
修改用户密码
passwd
修改已有用户的密码,但需注意的是,只执行 passwd 命令是修改当前用户的密码,如果想要修改非当前用户的密码,需要使用切换到root账户或使用sudo进行提权,如修改test用户的密码,需要执行 sudo passwd test 命令。
chpasswd
从文件中读取登录名密码对,并更新密码。
如果需要批量更新多个用户的密码,可以使用 chpasswd 命令,他能从标准输入自动读取登录名和密码对(由冒号分割)列表,给密码加密,然后为用户账户设置,如下:
注意,修改密码都要使用超级用户权限。
但常用的方法是将多个用户的登录名密码对写到文件中,然后重定向给该命令,如下:
文件内容为:
执行命令为:
sudo chpasswd < passwd.txt
注意文件中不能有空行,否则会报错。
修改用户默认shell
chsh
修改默认的用户登录shell,要用shell的绝对路径,如:
chsh -s /bin/bash testuser
修改用户说明信息
chfn
修改用户的说明信息,/etc/passwd 文件用户信息的第 5 个字段,
由于这涉及到用户的信息,也需要输入密码,如果是修改非当前用户的信息,还需要root权限。
修改用户账户有效期
chage
chage 命令用来帮助管理用户账户的有效期,对应 /etc/shadow 文件用户密码信息的第 4-8个字段。
可以用不同参数修改对应信息,如下:
| 参数 | 描述 |
|---|---|
| -d | 设置上次修改密码到现在的天数 |
| -E | 设置密码过期的日期 |
| -I (大写的i) | 设置密码过期到锁定账户的天数 |
| -m | 设置修改密码之间最少要多少天 |
| -W | 设置密码过期前多久开始出现提醒信息 |
chage 命令的日期值可以用下面两种方式中的任意一种:
YYYY-MM-DD格式的日期代表从1970年1月1日起到该日期天数的数值
对于密码过期的账户,和锁定的账户很相似:账户仍然存在,但用户无法用它登录。



