1、用户和组的管理命令
- 用户管理命令
- useradd
- usermod
- userdel
- 组账号维护命令
- groupadd
- groupmod
- groupdel
1.1 用户创建 useradd
- useradd 命令可以创建新的 Linux 用户
- 格式:
useradd [options] LOGIN
- 常见选项
-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 致命用户所属基本组,可为组名,也可以是GID
-c "COMMENT" 用户的注册信息
-d HOME_DIE 以指定的路径(不存在)为家目录
-s SHELL 致命用户的默认shell程序,可用列表在/etc/shells 文件中
-G GROUP1[,GROUP2...] 为用户指明附加组,组必须事先存在
-N 不创建私用组做主组,使用users组做主组
-r 创建系统用户,CentOS6 之前:ID<500,CentOS7 以后 ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
-P 指定加密的密码
- 范例:创建系统用户 apache ,UID为48、家目录为 /var/www/ 、基本组为 apache、添加用户注册信息Apache,不允许用户登录
useradd -r -u 48 -g apache -s /sbin/nologin -d /var/www -c "Apache" apache
- useradd 命令默认值由 /etc/default/useradd 文件定义而来
# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1 #对应/etc/shadow文件第7列,即用户密码过期后的账号锁定宽限期,-1表示不锁定
EXPIRE= #对应/etc/shadow文件第8列,即用户账号的有效期
SHELL=/bin/bash
SKEL=/etc/skel #用于生成新建用户家目录的模板文件
CREATE_MAIL_SPOOL=yes
- 显示或更改默认设置
useradd -D
useradd -D -s SHELL
useradd -D -b BASE_DIR
useradd -D -g GROUP
- 创建用户家目录环境变量模板
- 新建用户家目录的文件模板保存在 /etc/skel/ 目录中
- 如果想在新建用户的家目录中自动添加文件或环境变量,可以在该目录下手动添加
# ls /etc/skel/ -a
. .. .bash_logout .bash_profile .bashrc
1.2 删除用户
- userdel 可以删除 Linux 用户
- 格式:
userdel [OPTION]... Login
- 常见选项:
-f, --force 强制
-r, --remove 删除用户家目录和邮箱
1.3 查看用户相关ID信息
- id 命令可以查看用户 UID,GID等信息
- 格式:
id [OPTION]...[USER]
- 常见选项:
-u:显示UID
-g:显示GID
-G:显示用户所属的组ID
-n:显示名称,需配合ugG使用
1.4 用户属性修改 usermod
- usermod 命令可以修改用户属性
- 格式:
usermod [OPTION] login
- 常见选项
-u UID: 新UID
-g GID: 新主组
-G GROUP1[,GROUP2,...GROUPN]:新附加组,原来的附加组会被覆盖;若保留原有,则要同时使用 -a 选项
-s SHELL: 新的默认SHELL
-c 'COMMENT': 新注释信息
-d HOME: 新加目录不会自动创建,若要创建新家目录并移动原家目录数据,需同时使用 -m 选项
-l login_name: 新的名字
-L: 锁定指定用户,在/etc/shadow 密码栏增加 !
-U: 解锁指定用户,将/etc/shadow 密码栏的 !去掉
-e YYYY-MM-DD: 致命用户账号过期日期
-f INACTIVE: 设定非活动期限,即宽限期
- 范例:给用户添加附加组
# groupadd g1
# groupadd g2
# groupadd g3
# tail /etc/group
abrt:x:173:
sshd:x:74:
postdrop:x:90:
postfix:x:89:
tcpdump:x:72:
screen:x:84:
wentao:x:1000:
g1:x:1001:
g2:x:1002:
g3:x:1003:
# usermod -G g1,g2 wentao
# id wentao
uid=1000(wentao) gid=1000(wentao) groups=1000(wentao),1001(g1),1002(g2)
# groupmems -l -g g1
wentao
# groupmems -l -g g2
wentao
1.5 切换用户 su
- 切换用户命令 su 即 switch user, 该命令可以切换用户身份,并且制定用户身份执行命令
- 格式:
su [OPTIONS] [-] [USER [ARGS...]]
- 常见选项:
-l --login su -l [username] 相当于 su - username
-c --comand <command> pass a single command to the shell with -c
- 切换用户的方式:
- su username:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
- su - username:登录式切换,会读取目标用户的配置文件,切换至用户家目录即完全切换。
- 注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要在用 su 切换至旧用户,否则会生成多的 bash 子进程,环境可能会换乱
- 说明:root su 至其他用户无需尼玛;非 root 用户切换时需要密码
- 用其他用户身份执行命令,而不切换到该用户:
su [-] username -c 'COMMAND'
1.6 设置密码 passwd
- passwd 命令可以修改用户密码
- 格式:
passwd [OPTIONS] username
- 常用选项:
-d: 删除指定用户密码
-l: 锁定指定用户
-u: 解锁指定用户
-e: 强制用户下次登录修改密码
-f: 强制操作
-n: mindays 指定最短使用期限
-x: maxdays 最大使用期限
-w: warndays 提前多少天开始警告
-i: inactivedays 非活动期限
--stdin: 从标准输入接受用户密码(非交互式设置密码),Ubuntu 无此选项
- 范例:非交互式修改用户密码 --stdin
- --stdin 只适用于红帽系列的 Linux 版本
echo '123456' | passwd --stdin wentao
- 而其他版本的 Linux 系统例如 Ubuntu 则只能使用 echo -e 进行非交互式修改密码
echo -e '123456\n123456' | passwd wentao
1.7 修改用户密码策略 chage
- chage 可以修改用户密码策略
- 格式:
chage [OPTION]... LOGIN
- 常见选项:
-d LAST_DAY #指定密码最后修改的日期
-m --mindays MIN_DAYS #修改密码的最小天数
-M --maxdays MAX_DAYS #修改密码的最大天数
-W --warndays WARN_DAYS #密码过期,开始警告天数
-I --inactive INACTIVE #密码过期后的宽限期
-E --expiredate EXPIRE_DATE #用户的有效期,0表示立即过期,-1表示永不过期
-l 显示密码策略
- 范例:1
- 范例:2
1.8 创建组
- groupadd 实现创建组
- 格式:
groupadd [OPTION]... group_name
- 常见选项:
-g GID 指明GID号:[GID_MIN, GID_MAX]
-r 创建系统组,CentOS6之前:ID<500, CentOS7以后:ID<1000
- 范例:
groupadd -g 48 -r apache
1.9 修改组 groupmod
- groupmod 组属性修改
- 格式:
groupmod [OPTION]... group
- 常见选项:
-n group_name:新名字
-g GID:新的GID
1.10 删除组
- groupdel 可以删除组
- 格式:
groupdel [OPTIONS] GROUP
- 常见选项
-f --force 强制删除,即使是用户的主组也可以强制删除,但会导致无主组的用户不可用并且无法登陆
1.11 更改组成员和密码 gpasswd
- gpasswd 命令,可以更改组密码,也可以修改附加组的成员关系
- 格式:
gpasswd [OPTION] GROUP
- 常见选项
-a user 将user添加至指定组中
-d user 从指定附加组中移除用户user
-A user1,user2,... 设置有管理权限的用户列表
- 范例1:添加组成员
# groupadd admins
# gpasswd -a wentao admins
Adding user wentao to group admins
# id wentao
uid=1000(wentao) gid=1000(wentao) groups=1000(wentao),1001(g1),1002(g2),1004(admins)
# groups wentao
wentao : wentao g1 g2 admins
# getent group admins
admins:x:1004:wentao
- 范例2:删除组成员
# gpasswd -d wentao admins
Removing user wentao from group admins
# groups wentao
wentao : wentao g1 g2
# id wentao
uid=1000(wentao) gid=1000(wentao) groups=1000(wentao),1001(g1),1002(g2)
# getent group admins
admins:x:1004:
1.12 更改和查看组成员 groupmems, groups
- groupmems 命令可以管理附加组的成员关系
- 格式:
groupmems [options] [action]
- 常见选项
-g,--group grouname #更改为指定组(只有root)
-a,--add username #指定用户加入组
-d,--delete username #从组中删除用户
-p,--purge #从组中清楚所有成员
-l,--list
- groups 可查看用户组关系
- 格式:
groups [OPTION] [USERNAME]
- 范例:
# groupmems -a wentao -g admins
# groupmems -a Demi -g admins
# groupmems -a Jimmy -g admins
# groupmems -l -g admins
wentao Demi Jimmy
# groupmems -d Jimmy -g admins
# groupmems -l -g admins
wentao Demi
# groupmems -p -g admins
# groupmems -l -g admins
2、文件权限管理
- 程序访问文件时的权限,取决于此程序的发起者
- 进程的发起者,同文件的属主:则应用文件属主权限
- 进程的发起者,属于文件属组:则应用文件属组权限
- 应用文件“其他权限”
2.1 文件所有者和所属组属性操作
2.1.1 设置文件的所有者 chown
- chown 命令可以修改文件的属主,也可以修改文件属组
- 格式:
chown [OPTION]...[OWNER][:[GROUP]] FILE...
chown [OPTION]...--reference=RFILE FILE...
- 用法说明:
OWNER #只修改所有者
OWNER:GROUP #同时修改所有者和属组
:GROUP #只修改属组,冒号也可用 "." 替换
--reference=RFILE #参考指定的属性,来修改
-R #递归
- 范例
# 修改文件所有者
# chown wentao a.txt
# ll a.txt
-rw-r--r-- 1 wentao root 0 Oct 26 14:47 a.txt
# 修改文件所属组
# chown .g1 a.txt
# ll a.txt
-rw-r--r-- 1 wentao g1 0 Oct 26 14:47 a.txt
#递归
# touch data/{a,b}.txt
# ll data/
total 0
-rw-r--r-- 1 root root 0 Oct 26 15:21 a.txt
-rw-r--r-- 1 root root 0 Oct 26 15:21 b.txt
# chown -R wentao.bin data
# ll data/
total 0
-rw-r--r-- 1 wentao bin 0 Oct 26 15:21 a.txt
-rw-r--r-- 1 wentao bin 0 Oct 26 15:21 b.txt
# ll
total 0
drwxr-xr-x 2 wentao bin 32 Oct 26 15:21 data
2.1.2 设置文件的属组信息 chgrp
- chgrp 命令可以只修改文件的属组
- 格式:
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
- -R 递归
2.2 文件权限
2.2.1 文件权限说明
- 文件权限主要针对三类对象进行定义
- owner 属主,u
- group 属组,g
- other 其他,o
- 注意:
用户最终权限,是从左向右进行顺序匹配。即:所有者,所属组,其他人。一旦匹配完成,权限立即生效。
r 和 w 权限对 root 用户无效
只要 所有者,所属组 或 other 三者之一 有 x 权限,root 就可以执行
- 每个文件针对每类访问者都定义了三种常用权限
- 每个文件针对每类访问者都定义了三种权限
r readable 4
w writable 2
x excutable 1
- 对文件的权限:
r 可使用文件查看类工具,比如:cat,可以获取其内容
w 可修改其内容,文件的是否被删除和文件的权限无关
x 可以把此类文件提请内核启动为一个进程,即可以执行(运行)此文件(此文件的内容必须是可执行)
文件权限常见组合
--- 0
r-- 4
r-x 5
rw- 6
rwx 7
- 对目录的权限
r 可以使用 ls 查看此目录中文件名列表,但无法看到文件的属性 meta 信息,包括inode号,不能查看文件的内容
w 可再次目录中创建文件,也可删除此目录中的文件,而和此被删除的文件权限无关
x 可以 cd 进入此目录,可以使用 ls -l file 或 stat file 查看此目录中指定文件的元数据
目录权限常见组合
--- 不能访问目录
r-x 只读目录
rwx 可读也可写目录
- 数学法的权限
权限项 | 文件类型 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
字符表示 | (d|l|c|s|p) | r | w | x | r | w | x | r | w | x |
数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |
权限分配 | 文件所有者 | 文件所属组用户 | 其他用户 |
- 八进制数字
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
- 例如:
rw-r----- 640
rwxr-xr-x 755
2.2.2 修改文件权限 chmod
- 格式:
chmod [OPTION]...MODE[,MODE]...FILE
chmod [OPTION]...OCTAL-MODE FILE...
#参考 RFILE 文件的权限,将 FILE 的修改为同 RFILE
chmod [OPTION]... --reference=RFILE FILE...
- 说明:模式法格式
MODE:who opt permission
who:u,g,o,a
opt:+,-,=
permission:r,w,x
修改制定一类用户的所有权限
u= g= o= ug= a= u=,g=
修改制定一类用户某个或某几个权限
u+ u- g+ g- o+ o- a+ a- + -
-R:递归修改权限
2.3 新建文件和目录的默认权限
- umask 的值可以用来保留在创建文件权限
- 查看 umask
umask
# 模式方式显示
umask -S
# 输出可被调用
umask -p
# umask
0022
# umask -S
u=rwx,g=rx,o=rx
# umask -p
umask 0022
- 默认新建目录的权限是:755
- 默认新建文件的权限是:644
- 实现方式:
- 新建文件的默认权限:666 - umask,如果所得结果某位存在执行(奇数)权限,则将权限+1,没有执行权限(偶数)则不变
- 新建目录的默认权限:777 - umask
- root 用户的 umask 是 022,那么:
- root 用户 创建文件 就是 666 - 022 = 644 也就是:rw- r-- r--
- root 用户 创建目录 就是 777 - 022 = 755 也就是:rwx r-x r-x
# mkdir dir
# touch f1.txt
# ll
total 0
drwxr-xr-x 2 root root 6 Oct 28 15:24 dir
-rw-r--r-- 1 root root 0 Oct 28 15:24 f1.txt
- 修改 umask
umask #
- 范例
# umask 123
# umask
0123
# mkdir dir1
# touch f2.txt
# ll
total 0
drw-r-xr-- 2 root root 6 Oct 28 17:27 dir1
-rw-r--r-- 1 root root 0 Oct 28 17:27 f2.txt
- 以上范例将root 的umask权限修改成了123,那么
- root创建目录就是 777-123=654 也就是 rw- r-x r--
- root创建文件就是 666-123=543 也就应该是 r-x r-- -wx 结果却是 rw- r-- r-- 这是为什么呢?
- 注:文件的执行是危险的!
- 如果文件没有执行权限,root 也无法直接执行
- 基于安全考虑,默认新建的文件不允许有执行权限
- 所以 umask 规则规定,任何用户创建 文件只要出现执行权限(基数),就必须 +1
- 所以 root 的umask 是123的情况下 666-123 最终的出来的结果是 644 也就是 rw- r-- r--
- 持久保存 umask
- 全局设置:/etc/bashrc
- 用户设置:~/.bashrc
2.3.1 为什么root的umask值最大?
- root 用户的 umask 是022
- 普通用户的 umask 是002
- 那么为什么 root 用户的 umask 值最大?
- 因为用户的 umask 值越大,它创建的文件权限越小,相对来说文件的安全性就越高。
- 相对于普通用户来说 root 的文件更重要,所以root创建的文件权限就要更小一些。
2.4 Linux文件系统上的特殊权限
- 前面介绍了三种常见的权限:r,w,x 还有三种特殊权限: SUID,SGID,Sticky
- 特殊权限
- SUID 作用于二进制可执行文件上,用户将继承此程序所有者的权限
- SGID
- 作用于二进制可执行文件上,用户将继承此程序所有组的权限
- 作用于目录上,此目录中新建的文件所属组将自动从此目录继承
- STICKY 粘滞位作用于目录上,此目录中的文件只能由所有者自己来删除
2.4.1 特殊权限SUID
前提:进程有属主和属组;文件有属主和属组。
- 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者
二进制的可执行文件上SUID权限功能:
- 任何一个可执行文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为原程序文件的属主
- SUID 只对二进制可执行程序有效
- SUID 设置在目录上无意义
SUID权限设定:
chmod u+s FILE...
chmod 4xxx FILE
chmod u-s FILE...
范例:
# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 33424 Apr 20 2022 /usr/bin/passwd
2.4.2 特殊权限SGID
二进制可执行文件上SGID权限功能:
- 任何一个可执行文件能不能启动为进程:取决于发起者对程序文件是否有执行权
- 启动为进程之后,其进程的属组为原程序文件的属组
SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
2.4.3 特殊权限 Sticky 位
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权在目录设置 Sticky 位,只有文件的所有者或 root 可以删除该文件
Sticky 设置在文件上无意义
Sticky 权限设定
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
2.5 设定文件特殊属性
设置文件的特殊属性,可以访问 root 用户误操作删除或修改文件
- 不能删除、改名、修改
chattr +i [file_name]
- 只能追加内容,不能删除,改名
chattr +a [file_name]
- 显示特定属性
lsattr
- 范例:
# chattr +i a.txt
# lsattr a.txt
----i----------- a.txt
# echo helloworld > a.txt
-bash: a.txt: Permission denied
# mv b.txt a.txt
mv: cannot stat ‘b.txt’: No such file or directory
# rm -f a.txt
rm: cannot remove ‘a.txt’: Operation not permitted
2.6 ACL访问控制
setfacl 可设置ACL权限
getfacl 可查看设置的ACL权限
- 格式:
setfacl -m u:<user_name>:- FILE
- 范例:
# setfacl -m u:Jimmy:- a.txt
# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:Jimmy:---
group::r--
mask::r--
other::r--
-rw-r--r--+ 1 root root 0 Nov 2 16:24 a.txt
# 有ACL权限控制的文件在数字权限表示末尾有有 + 表示