接上一篇文章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日起到该日期天数的数值
对于密码过期的账户,和锁定的账户很相似:账户仍然存在,但用户无法用它登录。
2.4.2 Linux用户组
为了控制多个用户共享资源的安全性,Linux系统使用了用户组的概念。
和用户信息一样,用户组信息也有自己的保存位置 /etc/group
,如下:
每行代表一个组,每个组有4个字段,其格式如下:
组名:组密码占位符:GID:组中用户(多个用户用","隔开)
其中,
组密码占位符:和用户密码占位符类似,加密形式的密码单独存放在/etc/gshadow文件中。
GID:系统账户用的组通常会分配低于500的GID值,而用户组的GID则会从500开始分配。
组中用户:这个字段为空不代表组中没有用户,因为如果该组是某用户的初始组,则该用户不写在这里。
创建新用户组
groupadd
命令可在系统上创建新的用户组。
删除用户组
使用 groupdel
命令删除用户组,但删除的用户组不能是任何用户的初始组,否则会删除失败。
将用户添加到用户组
使用 usermod
命令将用户添加到用户组,其中 usermod
的 -g
选项是修改用户的归属组(默认组), -G
选项是修改用户的附加组,这里要注意,单独使用 -G
选项是修改附加组,要添加附加组需要配合 -a
选项。
如果添加附加组时,只用了 -G
选项,当前用户已有的其他附加组都会被删除。补救措施,发生这种情况千万不要重新登录,否则就没有后悔药了(因为当前内存里还保留该用户附加组信息,重新登录的话,会从/etc/group
文件重新读取信息到内存,当前用户附加组信息会被覆盖)。执行 groups
或 id
命令,会显示当前内存里该用户附加组信息,按照打印修改 /etc/group
文件即可。
将用户从用户组中删除
gpasswd -d user group
修改用户组
主要是修改 /etc/group
文件的内容,使用 groupmod
命令的 -g
选项可以修改已有组的GID,-n
选项可以修改组名,修改组名时,GID和组成员不会变,只有组名改变。由于所有的安全权限都是基于GID的,
所以可以随意改变组名而不会影响文件的安全性。
注意,如果修改了已登录用户的用户组,需要退出重新登录才会生效。
如下例子首先创建了新用户组 newgroup
,然后将用户 testuser
添加到了该组中,又将用户 testuser
从该组删除,将修改用户组名从 newgroup
修改为 testgroup
,最后删除了用户组 testgroup
。