个人用云计算学习笔记 --2(Shell variable、Linux 用户和组管理、Linux 提权管理、Linux 文件权限管理)
文章目录
Shell variable(8. Shell variable)
变量定义和查看
注意:变量名不能以数字开头
# 变量定义
[qy@centos7 ~ 12:34:00]$ var1=key1
# 标准格式如下
[qy@centos7 ~ 12:34:05]$ declare var1=key1
# 使用$引用变量值
[qy@centos7 ~ 12:34:15]$ echo $var1
key1
# 当前shell中有多少个变量
[qy@centos7 ~ 12:34:42]$ set
# 取消变量定义
[qy@centos7 ~ 12:40:11]$ unset first_name
[qy@centos7 ~ 12:44:23]$ echo $first_name
# 定义变量时候,转换变量大小写
[qy@centos7 ~ 12:44:32]$ declare -l name=James
[qy@centos7 ~ 12:45:49]$ echo $name
james
[qy@centos7 ~ 12:45:56]$ declare -u name=James
[qy@centos7 ~ 12:46:28]$ echo $name
JAMES
变量范围
- 局部变量,只在当前shell中生效。
- 全局变量,在当前shell以及shell子程序都生效。
[qy@centos7 ~ 13:34:28]$ username=tom
[qy@centos7 ~ 13:34:59]$ echo $username
tom
[qy@centos7 ~ 13:35:06]$ bash
[qy@centos7 ~ 13:35:11]$ echo $username
[qy@centos7 ~ 17:18:30]$export username=tom
# 或者
[qy@centos7 ~ 17:19:35]$username=tom;export username
[qy@centos7 ~ 17:19:57]$ echo $username
tom
[qy@centos7 ~ 17:20:09]$bash
[qy@centos7 ~ 17:20:18]$echo $username
tom
注:export命令主要用于设置或导出环境变量,核心作用为定义环境变量、传递变量到子程序、修改已有环境变量。
环境变量
- shell 环境内置变量:设置shell的运行环境。
- 用户自定义变量:字面意思,用户自己定义的变量,也就是普通变量。
部分shell环境变量如下:
| 环境变量名 | 作用 |
|---|---|
| EDITOR | 默认编辑器 |
| HISTFILE | 历史文件位置 |
| HISTFILESIZE | 历史命令个数 |
| PS1 | 命令行提示符 |
| LANG | shell环境语言 |
| PATH | 命令搜素路径 |
| HOME | 当前用户家目录 |
| USER | 当前用户 |
| PWD | 当前shell路径 |
完整的shell 环境变量参考bash(1)。
常见LANG代码
- 英语:en_US.utf8
- 简体中文:zh_CN.utf8
- 繁体中文:zh_TW.utf8
变量持久化保存
- login shell 启动的时候,会加载一下配置文件中配置
- /etc/profie,限定所有用户
- ~/.bash_profile,只限定特定用户
- ~/.bashrc,只限定特定用户
- /etc/bashrc,限定所有用户
- nologin shell启动的时候,会加载一下配置文件中配置
- ~/.bashrc,只限定特定用户
- /etc/bashrc,限定所有用户
命令替换
格式如下:
- $(COMMAND)
- `COMMAND
[qy@centos7 ~ 17:48:36]$echo Today is `date +%A`
Today is 星期二
[qy@centos7 ~ 17:48:51]$ echo The time is $(date +%M) minutes past $(date +%l%p).
The time is 49 minutes past 5下午.
[qy@centos7 ~ 17:49:07]$touch file-$(date +%Y%m%d)
# 或者
[qy@centos7 ~ 17:49:14]$ touch file-`date +%Y%m%d`
[qy@centos7 ~ 17:49:20]$ls
file-20250909
如何计算 1+2+..+99+100的值?
# 计算数值
[qy@centos7 ~ 17:49:33]$echo $[ 1+2+3 ]
6
# 获取序列
[qy@centos7 ~ 17:49:33]$echo $[ 1+2+3 ]
6
# 替换空格为+号
[qy@centos7 ~ 17:52:06]$echo {1..3} | tr ' ' '+'
1+2+3
# 计算结果
[qy@centos7 ~ 17:52:18]$ echo $[ $(echo {1..100} | tr ' ' '+') ]
5050
上题总结:
tr(translate 的缩写)是一个用于字符转换或删除的命令行工具,主要通过标准输入读取数据,对字符进行替换、压缩或删除后,输出到标准输出。
$() 命令替换 touch file-$(date +%Y%m%d),mkdir /backup.$(date +%Y%m%d)
$[] 计算数值 echo $[ 1+2+3 ]
${} 显示变量值,变量名使用{}括起来,用户限定变量名称边界。例如 echo ${last_name}_${first_name}
由上解剖该题
显示变量值:echo {1..100}
命令替换:$(echo {1..100} | tr ' ' '+')
计算数值:$ echo $[ $(echo {1..100} | tr ' ' '+') ]
保留字符字面含义
-
\,取消后面单个字符的特殊含义。
-
双引号(“”),压缩shell扩展含义,不压缩命令替换、变量替换和转义字符。
-
单引号(‘’),可以压缩单引号内部的所有字符含义。
# \和"" 示例 [qy@centos7 ~ 17:54:50]$echo "******* Welcome \$username to Linux Classroom On $(date +%F) *******" ******* Welcome $username to Linux Classroom On 2025-09-09 ******* # '' 示例 [qy@centos7 ~ 17:55:39]$echo '******* Welcome $username to Linux Classroom On $(date +%F) *******' ******* Welcome $username to Linux Classroom On $(date +%F) *******
实验(通过man查询命令属性)
1. man bash,/HISTTIMEFORMAT 找到这个变量
2. 根据提示,继续查看 man 3 strftime
3. 获取不同的时间戳 %F %r %R
4. 设置变量值HISTTIMEFORMAT="%F %r"
5. 执行history 命令验证效果
Linux用户和组管理(9. Linux 用户和组管理)
用户和组介绍
用户介绍
用户帐户主要有三种类型:
- superuser:用于管理系统,用户名称为root,UID为0,对系统具有完全访问权限。
- system users:系统具有系统用户帐户,由提供支持服务的进程使用。 这些进程或守护进程通常不需要以超级用户身份运行。 它们是非特权帐户,用户保护自己文件和其他资源。系统用户帐户不用于交互方式登录系统。
- regular users:大多数用户拥有常规用户帐户,用于日常工作。
passwd 文件
/etc/passwd 文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。
name:password:UID:GID:GECOS:directory:shell
示例
xxxxxxxxxx laoma:x:1000:1000:software admin:/home/laoma:/bin/bash
解释如下:
-
name:用户登录名
-
password:用户密码,以x表示
-
UID:用户ID
-
GID:用户主组ID
-
GECOS:用户描述信息,通常为用户的真实姓名
-
directory:用户主目录,启动shell时的工作目录,默认位于/home/username
-
shell:用户打开终端时运行的程序,默认是shell。
对于system user,它的shell是/sbin/nologin。
示例:
[qy@centos7 ~ 17:59:58]$grep postfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin
group 文件
组是用户的集合,组中用户继承组权限
/etc/group 文件保存操作系统组信息。每行包含一个组信息,以冒号分隔4个域。格式:
group_name:password:GID:user_list
示例:
[qy@centos7 ~ 18:00:22]$grep wheel /etc/group
wheel:x:10:
解释如下:
- group_name:组名称
- password:组密码,用x表示
- GID:组ID,唯一表示组
- user_list:作为补充的成员
组的类型
- 主要组:每个用户只有一个主要组,/etc/passwd 文件中的GID编号定义。 默认情况下,**用户创建的新文件组所有者为用户的主要组。**通常,在创建新的常规用户时,会创建一个与该用户同名的新组。该组用作新用户的主要组,该用户是此用户专用组的唯一成员,有助于简化文件权限管理。
- 补充组:用户还可以拥有补充组。 补充组的成员资格由/etc/group文件确定。 根据用户的任何组是否具有访问权限,授予用户访问权限的权限。例如,如果用户user01具有主要组user01和补充组wheel和webadmin,则该用户可以读取这三个组中任何一个组可读的文件。
本地用户管理
whoami
查看当前终端中登录的用户。
[root@centos7 ~ 17:18:16]# whoami
root
who 和 w 命令
查看当前系统中所有终端上登录的用户名。
[root@centos7 ~ 18:06:33]# who
qy :0 2025-09-05 11:36 (:0)
qy pts/0 2025-09-09 13:34 (10.1.8.1)
root pts/1 2025-09-09 14:26 (10.1.8.1)
qy pts/2 2025-09-09 17:48 (10.1.8.1)
qy pts/3 2025-09-09 10:28 (10.1.8.1)
[root@centos7 ~ 18:09:24]# w
18:09:40 up 11:35, 5 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
qy :0 :0 五11 ?xdm? 6:34 0.44s /usr/libexec/gnome-
qy pts/0 10.1.8.1 13:34 50:28 0.47s 0.35s bash
root pts/1 10.1.8.1 14:26 4.00s 0.79s 0.01s w
qy pts/2 10.1.8.1 17:48 8:28 0.19s 0.19s -bash
qy pts/3 10.1.8.1 10:28 2:05m 1.51s 0.39s bash
users 命令
查看当前系统中所有终端上登录的用户名。
[root@centos7 ~ 18:12:03]# users
qy qy qy qy root
useradd 命令
作用:创建用户
useradd [选项] 用户名
新用户家目录中的文件来源于 /etc/skel/ 目录。
创建用户的时候,用户属性默认参数配置在 /etc/login.defs 文件。
usermod 命令
usermod [选项] 用户名
常用选项:
| 选项 | 作用说明 |
|---|---|
-m / -mkdir-home | 强制创建用户的家目录(部分 Linux 发行版默认不创建,需显式添加此选项) |
-d / -home-dir | 指定用户的家目录(默认是 /home/用户名) |
-s / -shell | 指定用户的默认登录 shell(如 /bin/bash,禁止登录用 /sbin/nologin) |
-g / -gid | 指定用户的初始组(必须是已存在的组,通过 GID 或组名指定) |
-G / -groups | 指定用户的附加组(多个组用逗号分隔,用户会额外加入这些组) |
-c / -comment | 添加用户注释(如用户姓名、部门,会显示在 /etc/passwd 的第 5 字段) |
-u / -uid | 指定用户的唯一 UID(需确保未被其他用户占用,普通用户 UID 建议≥1000) |
-e / -expiredate | 设置用户账户过期日期(格式 YYYY-MM-DD,过期后无法登录) |
注意事项:
-
权限要求:
useradd是系统级命令,必须以root用户或通过sudo执行,普通用户无权限创建新用户。 -
密码设置:
useradd仅创建用户,不会自动设置密码,需手动执行passwd 用户名为用户设置密码(否则用户无法登录)。 -
配置文件依赖:
useradd的默认行为(如默认 shell、家目录路径)由/etc/default/useradd配置文件控制,不同发行版(如 Ubuntu、CentOS)的默认值可能不同,可通过cat /etc/default/useradd查看。 -
与
adduser的区别:部分 Linux 发行版(如 Ubuntu)提供adduser命令,它是useradd的交互式封装工具(会引导输入密码、注释等信息),而useradd是更底层的非交互式工具,适合脚本自动化操作。
userdel 命令
userdel [选项] 用户名
常用选项
| 选项 | 作用说明 |
|---|---|
-r / --remove | 删除用户的同时,自动删除其家目录(/home/用户名)和邮件缓存(/var/spool/mail/用户名) |
-f / --force | 强制删除用户,即使该用户当前正处于登录状态(谨慎使用) |
-h / --help | 显示帮助信息 |
注意事项
- 权限要求:必须以
root身份或通过sudo执行,普通用户无权限删除用户。 - 用户登录状态:默认情况下,若用户正在登录(可通过
who或w命令查看),userdel会拒绝删除,避免系统异常。如需强制删除,需使用-f选项,但可能导致用户进程异常终止。 - 家目录处理:
- 不加
-r时,家目录会被保留(需手动删除) - 加
-r时,会递归删除家目录及邮件文件,请确认数据已备份
- 不加
- 文件所有权:用户删除后,该用户之前创建的文件(非家目录内)不会被自动删除,其所有权会变为对应的 UID(如
1001),需手动处理这些文件的权限或归属。 - 与
userdel相关的命令:userdel -r 用户名:彻底清理用户数据id 用户名:删除前确认用户是否存在ls -la /home:检查家目录是否残留
本地组管理
groupadd 命令
groupadd [选项] 组名
常用选项
| 选项 | 作用说明 |
|---|---|
-g / --gid | 指定组的 GID(组 ID),需确保该 GID 未被其他组占用(默认会自动分配,系统组通常 < 1000,普通组≥1000) |
-r / --system | 创建系统组(GID 范围通常在 1-999 之间,用于系统服务权限管理) |
-h / --help | 显示帮助信息 |
注意事项
- GID 唯一性:每个组的 GID 必须唯一,使用
-g选项时需确保指定的 GID 未被占用(可通过cat /etc/group查看已有 GID)。 - 组的作用:创建组后,需通过
usermod -aG 组名 用户名命令将用户加入组中,用户才能继承该组的权限。 - 与组相关的其他命令:
groups 用户名:查看用户所属的组groupdel 组名:删除用户组(需确保组内无用户,或先移除用户)groupmod 选项 组名:修改已有组的配置(如变更 GID 或组名)
groupmod 命令
groupmod [选项] 组名
常用选项
| 选项 | 作用说明 |
|---|---|
-g / --gid GID | 为组指定新的 GID(必须是未被其他组占用的唯一 ID) |
-n / --new-name 新组名 | 将现有组名修改为新组名 |
-h / --help | 显示帮助信息 |
注意事项
- GID 变更的影响:
- 组的 GID 变更后,所有属于该组的文件 / 目录的组所有权会自动关联到新 GID(系统内部通过 GID 识别组,而非组名)。
- 但需注意:若有进程正依赖旧 GID 运行,可能需要重启进程以适应变更。
- 组名变更的影响:
- 组名仅为 “别名”,变更后不影响文件权限(权限基于 GID),但会影响用户对组的识别(如
groups命令显示新组名)。
- 组名仅为 “别名”,变更后不影响文件权限(权限基于 GID),但会影响用户对组的识别(如
- 组内用户:
groupmod仅修改组本身的属性,不会改变组内的用户成员(如需修改成员,需用usermod或gpasswd)。 - 与其他命令的配合:
- 修改组后,可用
grep 组名 /etc/group验证变更结果 - 若需删除组,使用
groupdel命
- 修改组后,可用
groupdel命令
删除组
groupdel [选项] 组名
groupmem 命令
是便捷地对指定用户组进行成员的添加、移除、查看或清空操作
groupmems [选项] [参数]
常用选项
| 选项 | 英文全称 | 作用说明 |
|---|---|---|
-l | --list | 列出指定组的成员;若不指定组,默认列出当前用户所属组的成员。 |
-a | --add | 向指定组添加一个或多个用户(多个用户用空格分隔)。 |
-d | --delete | 从指定组移除一个或多个用户(多个用户用空格分隔)。 |
-p | --purge | 清空指定组的所有成员(删除组内所有用户,需谨慎)。 |
-g | --group | 指定要操作的组名;若不指定,默认操作当前用户的 “有效组”(id -gn 查看)。 |
注意事项
-
所有操作需
root权限(或通过sudo执行),否则会提示权限不足。 -
初始组限制:
groupmems仅能管理用户的 “附加组”,无法修改用户的 “初始组”(用户创建时指定的-g组);若需修改初始组,需使用usermod -g 新组 用户名。 -
组存在性校验:必须先通过
groupadd创建目标组,才能用groupmems管理其成员;若组不存在,会提示group 'xxx' does not exist。 -
用户存在性校验:添加的用户必须已存在(通过
useradd创建),否则会提示user 'xxx' does not exist。 -
与其他命令的区别:
- 和
gpasswd相比:groupmems语法更简洁,聚焦 “成员增删查”;gpasswd还支持设置组密码、组管理员。
- 和
usermod相比:groupmems直接操作 “组”(为组添加成员);usermod -aG操作 “用户”(为用户追加附加组),逻辑角度不同。
- 和
管理用户密码
shadow 文件
/etc/shadow 文件保存操作系统登录用户密码信息。
[root@centos7 ~]# grep laoma /etc/shadow
laoma:$6$m0OgWyIu$P2TF1pB8MO...J3LopEUdhmp/Ir/:19300:0:99999:7:::
解释如下:
- login name:用户登录名。
- encrypted password:加密的密码。
- date of last password change:上一次密码更改日期,以距离1970-1-1过去的天数表示。设置为0,强制用户下次登录时更改密码。
- minimum password age:最小密码生命周期。设置为0,密码可以随时更改。
- maximum password age:最大密码生命周期。
- password warning period:密码过期前,提前多少天告警。设置为0,不提示过期。
- password inactivity period:密码过期后,非活跃天数,在期间密码仍可以使用。
- account expiration date:账户过期时间,以距离1970-1-1过去的天数表示。
- reserved field:保留域。
chage 命令

usermod -p 更改用户密码
usermod -p <加密后的密码> 用户名
usermod -s 限定用户shell
usermod -s <Shell路径> <用户名>
usermod -L 锁定用户密码
等效于 passwd -l
usermod -U 解锁用户密码
等效于 passwd -u
passwd -d 删除密码
passwd -d <用户名>
补充
如果我们将普通用户的uid该为0 ,该用户获得与 root 完全等同的超级权限
(永远不要将普通用户的 UID 改为 0)
Linux 提权管理(10. Linux 提权管理)
大多数时候Linux系统管理员以非特权用户身份登录系统,并使用工具暂时获得特权用户root管理系统。
su 命令
- 示例1:
su username启动一个非登录shell,使用当前的环境设置(上一个用户) - 示例2:
su - username启动一个登录shell,设置了shell环境(常用)
username 省略时,代表切换到root账户。
# 不加用户名的 nologin shell
[qy@centos7 ~ 18:54:09]$su
密码:
[root@centos7 qy 18:54:19]#
[root@centos7 qy 18:54:19]#set | grep qy
# 很多环境变量仍保留为qy用户
LOGNAME=qy
MAIL=/var/spool/mail/qy
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/qy/.local/bin:/home/qy/bin
PWD=/home/qy
USER=qy
XDG_DATA_DIRS=/home/qy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
# 所有环境变量都更改为了root用户
[qy@centos7 ~ 19:05:05]$su -
密码:
上一次登录:二 9月 9 18:54:19 CST 2025pts/0 上
最后一次失败的登录:二 9月 9 19:05:04 CST 2025pts/0 上
最有一次成功登录后有 1 次失败的登录尝试。
[root@centos7 ~ 19:05:13]#set | grep qy
[root@centos7 ~ 19:05:50]#
提示: 尽可能使用 loging shell 登录。
# 以特定用户身份执行特定命令
[root@centos7 ~ 19:06:29]#su - laowang -c id
uid=1003(laowang) gid=1003(laowang) 组=1003(laowang)
- su 用户名:仅切换用户身份,但保留原用户的工作目录和大部分环境变量。
- su -l 用户名:切换身份的同时,完全切换到目标用户的登录环境(目录、变量、配置等)。
su -l完全等价于su -
su -c用于以指定用户身份执行单个命令的快捷方式,无需切换到该用户的交互式 Shell 环境。
su -c "命令" 用户名
su -s切换到目标用户,并强制使用指定的 Shell 环境
su -s 目标Shell 用户名
sudo命令
从根本上说,Linux实现了一个非常粗糙的获得权限模型:root 可以做任何事情,其他用户与系统相关什么也不能做。
- su 缺点:
- 用户必须知道 root 用户密码获取 root 用户所有权限。
- 未记录用户执行命令。
- 无法以
/sbin/nologin的用户身份运行命令。
- sudo 优点:
- sudo 允许用户以其他用户身份执行特定命令。
- sudo 需要用户输入用户自己的密码,而非他们想访问的用户密码。
- sudo 执行的命令会记录在
/var/log/secure文件中。
sudo 语法:sudo [选项] 命令
常用选项
| 选项 | 功能描述 |
|---|---|
| -u 用户名 | 以指定用户的身份执行命令(而非默认 root)。 |
| -i | 切换到目标用户的交互式登录 Shell(环境变量完全切换为目标用户的配置)。 |
| -s | 启动目标用户的非登录 Shell(保留当前环境变量,仅切换身份)。 |
| -l | 列出当前用户可执行的 sudo 命令(查看权限范围)。 |
| -k | 清除密码缓存(下次执行 sudo 需重新输入密码,默认缓存约 5 分钟)。 |
| -c 命令 | 执行单条命令字符串(适合脚本中使用)。 |
sudo 配置
[root@centos7 ~]# export EDITOR=vim
[root@centos7 ~]# visudo
# 其中两条记录,达标wheel组中成员,可以以任何用户身份执行任何命令
root ALL=(ALL) ALL
# 组以%开头
%wheel ALL=(ALL) ALL
#添加:
用户名 ALL=(ALL) NOPASSWD:ALL
#不需要输入密码情况下,直接执行命令
用户名 ALL=(ALL) ALL
#只能够执行特定命令。
用户名 ALL=(ALL) /sbin/useradd,/sbin/usermod,/sbin/userdel
**总结:**在分配命令的时候,切记只给用户特定功能的命令(例如用户管理相关命令),而不是通用功能的工具(例如 vim)。
配置文件路径:
- 主配置文件:
/etc/sudoers,正常情况不要修改。 - 从配置文件:
/etc/sudoer.d/*,如果想添加配置,在此处添加。
补充
任何一个工具或者服务,它的配置文件至少有两个位置:
- 全局 /etc/sudoers
- 引用的目录中多个独立的。 /etc/sudoers.d/*
设置用户权限为审计权限:文件(cat less) 目录(ls)
命令别名alias
alias 别名="原命令"
总结
以下是关于 Linux 中 su 和 sudo 使用的几条建议:
- 优先使用
sudo而非su
sudo允许临时获取管理员权限,操作完成后自动退回普通用户状态,降低误操作风险;而su会直接切换到 root 身份,长期保持高权限状态存在安全隐患。 - ?限制
su的使用范围
尽量仅在需要长时间执行多个管理员操作时使用su,且完成后立即通过exit退出 root 身份,避免在 root 权限下进行日常操作。 - 合理配置
sudoers文件
通过visudo命令配置sudoers,精确控制用户可执行的管理员命令(如user ALL=(ALL) /bin/apt),避免授予无限制的sudo权限。 - 注意命令的完整路径
使用sudo时,尽量指定命令的绝对路径(如sudo /usr/bin/apt update),防止因环境变量篡改导致的安全风险。 - 避免在脚本中硬编码
sudo密码
不要在脚本中直接写入sudo密码(如通过管道传递),可通过配置sudoers实现特定命令免密执行,或使用更安全的权限管理方式。 - 定期审计操作日志
sudo的操作会记录在/var/log/auth.log(或/var/log/secure)中,定期检查日志可追踪权限使用情况,及时发现异常操作。 - 使用
sudo -i替代su进行交互式操作
若需要类似su的交互式 root 环境,可使用sudo -i,它会加载 root 的环境变量,同时保留sudo的日志记录功能。
Linux 文件权限管理(11.Linux 文件权限管理)
文件系统权限介绍
对于/etc/passwd文件来说,-rw-r–r–字符串分成四份,格式如下:
- 第一位代表文件类型,例如,**-**代表普通文件,d代表目录,l(L的小写)代表软链接等。
- 第二到第四位,代表user-owner具有的权限,也就是laoma用户具有的权限。
- 第五到第七位,代表group-owner具有的权限,也就是laoma组中成员具有的权限。
- 第八到第十位,代表user-owner和group-owner之外的用户具有的权限。

权限优先级
如果文件的用户是laoma,组成员中也有laoma用户,那么laoma获得最终权限是laoma用户拥有者的权限,而不是组中成员具有的权限。
rwx 权限解读

文件系统权限管理
chmod 命令(变更权限)
chmod [用户][操作][权限] 文件名/目录名
- 用户:
u(所有者)、g(组)、o(其他)、a(所有用户,默认) - 操作:
+(添加权限)、-(移除权限)、=(设置权限,覆盖原有) - 权限:
r、w、x
用户 操作 权限部分可以用三位数字(0-7)表示权限,每位对应一类用户(u、g、o),数值为权限的总和:
r=4、w=2、x=1,例如rwx=4+2+1=7,r-x=4+0+1=5
常用数字组合:
777:所有用户都有读、写、执行权限(不推荐,安全性差)755:所有者有全部权限,组和其他用户有读和执行权限(常用于脚本、程序)644:所有者有读 / 写权限,组和其他用户只读(常用于普通文件)
常用选项:
-R:递归修改目录及其子目录、文件的权限(谨慎使用,避免批量误改)
chmod -R 755 project/ # 修改 project 目录下所有内容的权限
-v:显示修改过程的详细信息
chmod -v 644 file.txt # 输出修改结果
chown chgrp 命令(更改文件属主)
chown [选项] 新所有者[:新所属组] 文件名/目录名
-
新所有者:可以是用户名(如
alice)或用户 ID(UID,如1000) -
新所属组(可选):可以是组名(如
dev)或组 ID(GID,如1001),需用:与所有者分隔 -
若只写
新所有者(不加:),则仅修改所有者,所属组不变 -
若写成
:新所属组(省略所有者),则仅修改所属组(效果类似chgrp) -
-R:递归修改目录及其子目录、文件的所有者 / 所属组(处理目录时常用) -
-v:显示修改过程的详细信息(verbose 模式) -
-c:仅显示有变化的修改(比-v更简洁) -
-h:修改符号链接本身的所有者(而非链接指向的目标文件)
chgrp [选项] 新组名 文件名/目录名
-
新组名:可以是组名(如
developers)或组 ID(GID,如1001) -
文件名 / 目录名:要修改的目标文件或目录
-
-R:递归修改目录及其子目录、文件的所属组(处理目录时常用) -
-v:显示修改过程的详细信息(verbose 模式) -
-c:仅显示有变化的修改(类似-v但更简洁)
!权限补充说明
- 对于文件来说:
- 赋予 w 权限的时候,也会赋予 r 权限。
- 赋予 x 权限的时候,也会赋予 r 权限。
- 对于目录来说:
- 赋予 r 权限的时候,也会赋予 x 权限。
- 赋予 w 权限的时候,也会赋予 rx 权限。

管理文件默认权限
umask 命令
umask 的核心作用
当创建新文件或目录时,系统会先赋予一个 “最大基础权限”,再减去umask值,得到最终的默认权限:
- 普通文件的最大基础权限是
666(rw-rw-rw-,默认无执行权限,避免安全风险) - 目录的最大基础权限是
777(rwxrwxrwx,目录需要执行权限才能进入)
计算公式:
最终权限 = 最大基础权限 - umask值
umask 的表示形式
umask 有数字表示法和符号表示法两种,日常使用中以数字表示法为主。
- 数字表示法(常用)
由 3 个数字组成(对应所有者、所属组、其他用户),每个数字范围是 0-7,含义与文件权限的数字表示一致(4=读、2=写、1=执行)。
例如:umask 022 表示:
- 所有者:0(不限制)
- 所属组:2(禁止写权限)
- 其他用户:2(禁止写权限)
- 符号表示法(较少用)
与 chmod 的符号模式类似,通过 u(所有者)、g(组)、o(其他)和 +(添加限制)、-(取消限制)表示。
例如:umask u=,g=w,o=w 等价于 umask 022(禁止组和其他用户的写权限)
系统默认 umask 值
不同用户的默认 umask 通常不同(由 /etc/profile 或 /etc/bashrc 配置):
- root 用户:默认
022或027(更严格) - 普通用户:默认
002或022
补充
- umask 是 “限制” 而非 “直接设置”:它仅规定 “禁止哪些权限”,而非直接定义最终权限(最终权限由最大基础权限减去 umask 得到)。
- 文件与目录的区别:新文件默认永远没有执行权限(即使 umask 允许),如需执行权限,需手动用
chmod +x添加;目录则会根据计算结果包含执行权限(否则无法进入)。 - 常见场景选择:
- 个人私有文件:
umask 077(仅自己可访问) - 团队共享目录:
umask 002(组内用户可读写,其他用户只读) - 公共目录(如
/tmp):umask 022(默认,平衡可用性和安全性)
- 个人私有文件:
- 与 chmod 的配合:
umask仅控制 “新创建” 的文件权限,已有文件的权限需用chmod修改。
管理文件特殊权限
| 权限类型 | 符号表示 | 八进制值 | 作用说明 | 典型应用场景 |
|---|---|---|---|---|
| SUID | s(用户执行位) | 4 | 执行文件时临时获得文件所有者权限(通常用于普通用户执行需 root 权限的操作) | /usr/bin/passwd(修改密码) |
| SGID | s(组执行位) | 2 | 对文件:执行时临时获得文件所属组权限;对目录:新建文件继承目录所属组 | 共享目录(如 /var/www) |
| Sticky Bit | t(其他执行位) | 1 | 目录中,仅文件所有者或 root 可删除该文件(防止他人误删共享文件) | /tmp(临时文件目录) |
以上符号与rwx中的x同级,如下
-rwsr-xr-x
drwxrwxrwt
管理文件扩展权限
chattr(设置特殊属性)
#添加权限
chattr +[选项] [文件]
#删除权限
chattr -[选项] [文件]
| 属性 | 功能说明 | 典型应用场景 |
|---|---|---|
i | 不可修改(immutable) 设置后:无法修改、删除、重命名文件;不能更改权限 / 所有者;root 也受限制(除非取消该属性)。 | 保护系统关键文件(如 /etc/passwd、/etc/shadow)、重要配置文件,防止误操作或恶意篡改。 |
a | 只能追加(append only) 设置后:仅允许向文件追加内容(如日志写入),不能删除、修改原有内容;root 同样受限制。 | 保护日志文件(如 /var/log/messages、/var/log/auth.log),确保日志完整性,防止被篡改或删除。 |
s | 删除时彻底擦除 文件删除后,其数据块会被直接清零(而非仅标记为空闲),无法通过数据恢复工具找回。 | 处理敏感文件(如密码文件、密钥、临时敏感数据),防止删除后被恶意恢复。 |
u | 可恢复删除 文件删除后仍保留数据块,可通过工具尝试恢复(与 s 属性互斥)。 | 重要文件(如文档、代码),防止误删后无法恢复(需配合特定工具使用)。 |
d | 不参与备份 设置后,dump 等备份工具会忽略该文件 / 目录。 | 临时文件、缓存文件(如 /tmp 下的文件),无需备份以节省备份空间和时间。 |
S | 同步更新 文件内容修改后立即写入磁盘(而非先存于缓存),类似 sync 命令的实时效果。 | 数据库文件、交易记录等需要即时持久化的文件,避免缓存未写入磁盘导致的数据丢失。 |
管理文件访问控制列表
通过访问控制列表给不同的用户赋予不同的权限。
getfacl(查看文件或目录的访问控制列表权限的命令)
getfacl [选项] 文件/目录
用于查看文件或目录的 ACL(Access Control Lists,访问控制列表)权限的命令。getfacl 能让你看到文件的 “完整权限图景”,包括传统权限(ls等)无法体现的扩展访问控制规则。
与传统权限的关系
- 传统权限是 ACL 的特殊情况(仅包含所有者、所属组、其他用户三类条目)。
- ACL 是传统权限的扩展,允许为任意用户 / 组分配权限,实现更细粒度的控制。
getfacl能同时展示传统权限和扩展 ACL 权限,而ls -l只能显示传统权限及 ACL 存在的标记(如权限字符串后的+号,例如rw-rw-r--+表示存在 ACL 权限)。
setfacl(设置文件或目录的访问控制列表权限)
setfacl [选项] 规则 文件/目录
#规则为:类型:主体:权限
传统的 chmod 命令只能控制 “所有者、所属组、其他用户” 三类主体的权限,而 setfacl 可以:
- 为特定用户(非所有者)分配单独的权限。
- 为特定组(非所属组)分配单独的权限。
- 为目录设置默认 ACL(控制新建文件 / 子目录自动继承的权限)。
常用选项
-m:修改或添加 ACL 规则(最常用)。-x:删除指定的 ACL 规则。-b:删除所有扩展 ACL 规则(保留传统权限)。-R:递归应用规则到目录及所有子文件 / 子目录。-d:设置默认 ACL(仅对目录有效,控制新建文件的继承权限)。
常用规则
| 规则 | 含义说明 |
|---|---|
u:bob:rw- | 给用户 bob 授予读写权限(无执行权限)。 |
g:dev:r-x | 给组 dev 授予读和执行权限(无写权限)。 |
u::rwx | 设置文件所有者的权限为读写执行(等价于 chmod u=rwx)。 |
g::r-- | 设置文件所属组的权限为只读(等价于 chmod g=r--)。 |
m:rw- | 设置权限掩码为读写(限制所有额外用户 / 组的最大权限不超过 rw-)。 |
o:--- | 设置 “其他用户” 的权限为无(等价于 chmod o=---)。 |
u:alice:7 | 用数字表示:给用户 alice 授予 rwx 权限(4+2+1=7)。 |
特殊规则
当使用 -d 选项(设置默认 ACL)时,规则前会隐含 default: 前缀,表示该规则将被目录下的新建文件 / 子目录继承。格式为:
default:类型:主体:权限
mask 设置
为了防止权限失控,最后一步设置相关用户的最大权限。
针对目录的 acl
在具有默认acl规则的目录中创建文件,文件会继承目录的默认acl。
更多推荐



所有评论(0)