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命令行提示符
LANGshell环境语言
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,过期后无法登录)

注意事项:

  1. 权限要求useradd 是系统级命令,必须以 root 用户或通过 sudo 执行,普通用户无权限创建新用户。

  2. 密码设置useradd 仅创建用户,不会自动设置密码,需手动执行 passwd 用户名 为用户设置密码(否则用户无法登录)。

  3. 配置文件依赖useradd 的默认行为(如默认 shell、家目录路径)由 /etc/default/useradd 配置文件控制,不同发行版(如 Ubuntu、CentOS)的默认值可能不同,可通过 cat /etc/default/useradd 查看。

  4. adduser 的区别:部分 Linux 发行版(如 Ubuntu)提供 adduser 命令,它是 useradd交互式封装工具(会引导输入密码、注释等信息),而 useradd 是更底层的非交互式工具,适合脚本自动化操作。

userdel 命令

userdel [选项] 用户名

常用选项

选项作用说明
-r / --remove删除用户的同时,自动删除其家目录(/home/用户名)和邮件缓存(/var/spool/mail/用户名
-f / --force强制删除用户,即使该用户当前正处于登录状态(谨慎使用)
-h / --help显示帮助信息

注意事项

  1. 权限要求:必须以 root 身份或通过 sudo 执行,普通用户无权限删除用户。
  2. 用户登录状态:默认情况下,若用户正在登录(可通过 whow 命令查看),userdel 会拒绝删除,避免系统异常。如需强制删除,需使用 -f 选项,但可能导致用户进程异常终止。
  3. 家目录处理
    • 不加 -r 时,家目录会被保留(需手动删除)
    • -r 时,会递归删除家目录及邮件文件,请确认数据已备份
  4. 文件所有权:用户删除后,该用户之前创建的文件(非家目录内)不会被自动删除,其所有权会变为对应的 UID(如 1001),需手动处理这些文件的权限或归属。
  5. userdel 相关的命令
    • userdel -r 用户名:彻底清理用户数据
    • id 用户名:删除前确认用户是否存在
    • ls -la /home:检查家目录是否残留

本地组管理

groupadd 命令

groupadd [选项] 组名

常用选项

选项作用说明
-g / --gid指定组的 GID(组 ID),需确保该 GID 未被其他组占用(默认会自动分配,系统组通常 < 1000,普通组≥1000)
-r / --system创建系统组(GID 范围通常在 1-999 之间,用于系统服务权限管理)
-h / --help显示帮助信息

注意事项

  1. GID 唯一性:每个组的 GID 必须唯一,使用 -g 选项时需确保指定的 GID 未被占用(可通过 cat /etc/group 查看已有 GID)。
  2. 组的作用:创建组后,需通过 usermod -aG 组名 用户名 命令将用户加入组中,用户才能继承该组的权限。
  3. 与组相关的其他命令
    • groups 用户名:查看用户所属的组
    • groupdel 组名:删除用户组(需确保组内无用户,或先移除用户)
    • groupmod 选项 组名:修改已有组的配置(如变更 GID 或组名)

groupmod 命令

groupmod [选项] 组名

常用选项

选项作用说明
-g / --gid GID为组指定新的 GID(必须是未被其他组占用的唯一 ID)
-n / --new-name 新组名将现有组名修改为新组名
-h / --help显示帮助信息

注意事项

  1. GID 变更的影响
    • 组的 GID 变更后,所有属于该组的文件 / 目录的组所有权会自动关联到新 GID(系统内部通过 GID 识别组,而非组名)。
    • 但需注意:若有进程正依赖旧 GID 运行,可能需要重启进程以适应变更。
  2. 组名变更的影响
    • 组名仅为 “别名”,变更后不影响文件权限(权限基于 GID),但会影响用户对组的识别(如 groups 命令显示新组名)。
  3. 组内用户groupmod 仅修改组本身的属性,不会改变组内的用户成员(如需修改成员,需用 usermodgpasswd)。
  4. 与其他命令的配合
    • 修改组后,可用 grep 组名 /etc/group 验证变更结果
    • 若需删除组,使用 groupdel

groupdel命令

删除组

groupdel [选项] 组名

groupmem 命令

是便捷地对指定用户组进行成员的添加、移除、查看或清空操作

groupmems [选项] [参数]

常用选项

选项英文全称作用说明
-l--list列出指定组的成员;若不指定组,默认列出当前用户所属组的成员。
-a--add向指定组添加一个或多个用户(多个用户用空格分隔)。
-d--delete从指定组移除一个或多个用户(多个用户用空格分隔)。
-p--purge清空指定组的所有成员(删除组内所有用户,需谨慎)。
-g--group指定要操作的组名;若不指定,默认操作当前用户的 “有效组”(id -gn 查看)。

注意事项

  1. 所有操作需 root 权限(或通过 sudo 执行),否则会提示权限不足。

  2. 初始组限制groupmems 仅能管理用户的 “附加组”,无法修改用户的 “初始组”(用户创建时指定的 -g 组);若需修改初始组,需使用 usermod -g 新组 用户名

  3. 组存在性校验:必须先通过 groupadd 创建目标组,才能用 groupmems 管理其成员;若组不存在,会提示 group 'xxx' does not exist

  4. 用户存在性校验:添加的用户必须已存在(通过 useradd 创建),否则会提示 user 'xxx' does not exist

  5. 与其他命令的区别:

    • 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 -
密码:
上一次登录:二 99 18:54:19 CST 2025pts/0 上
最后一次失败的登录:二 99 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/*,如果想添加配置,在此处添加。

补充

任何一个工具或者服务,它的配置文件至少有两个位置:

  1. 全局 /etc/sudoers
  2. 引用的目录中多个独立的。 /etc/sudoers.d/*

设置用户权限为审计权限:文件(cat less) 目录(ls)

命令别名alias

alias 别名="原命令"

总结

以下是关于 Linux 中 susudo 使用的几条建议:

  1. 优先使用 sudo 而非 su
    sudo 允许临时获取管理员权限,操作完成后自动退回普通用户状态,降低误操作风险;而 su 会直接切换到 root 身份,长期保持高权限状态存在安全隐患。
  2. ?限制 su 的使用范围
    尽量仅在需要长时间执行多个管理员操作时使用 su,且完成后立即通过 exit 退出 root 身份,避免在 root 权限下进行日常操作。
  3. 合理配置 sudoers 文件
    通过 visudo 命令配置 sudoers,精确控制用户可执行的管理员命令(如 user ALL=(ALL) /bin/apt),避免授予无限制的 sudo 权限。
  4. 注意命令的完整路径
    使用 sudo 时,尽量指定命令的绝对路径(如 sudo /usr/bin/apt update),防止因环境变量篡改导致的安全风险。
  5. 避免在脚本中硬编码 sudo 密码
    不要在脚本中直接写入 sudo 密码(如通过管道传递),可通过配置 sudoers 实现特定命令免密执行,或使用更安全的权限管理方式。
  6. 定期审计操作日志
    sudo 的操作会记录在 /var/log/auth.log(或 /var/log/secure)中,定期检查日志可追踪权限使用情况,及时发现异常操作。
  7. 使用 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(所有用户,默认)
  • 操作+(添加权限)、-(移除权限)、=(设置权限,覆盖原有)
  • 权限rwx

用户 操作 权限部分可以用三位数字(0-7)表示权限,每位对应一类用户(u、g、o),数值为权限的总和:

  • r=4w=2x=1,例如 rwx=4+2+1=7r-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值,得到最终的默认权限:

  • 普通文件的最大基础权限是 666rw-rw-rw-,默认无执行权限,避免安全风险)
  • 目录的最大基础权限是 777rwxrwxrwx,目录需要执行权限才能进入)

计算公式:
最终权限 = 最大基础权限 - umask值

umask 的表示形式

umask数字表示法符号表示法两种,日常使用中以数字表示法为主。

  1. 数字表示法(常用)

由 3 个数字组成(对应所有者、所属组、其他用户),每个数字范围是 0-7,含义与文件权限的数字表示一致(4=读2=写1=执行)。

例如:umask 022 表示:

  • 所有者:0(不限制)
  • 所属组:2(禁止写权限)
  • 其他用户:2(禁止写权限)
  1. 符号表示法(较少用)

chmod 的符号模式类似,通过 u(所有者)、g(组)、o(其他)和 +(添加限制)、-(取消限制)表示。

例如:umask u=,g=w,o=w 等价于 umask 022(禁止组和其他用户的写权限)

系统默认 umask 值

不同用户的默认 umask 通常不同(由 /etc/profile/etc/bashrc 配置):

  • root 用户:默认 022027(更严格)
  • 普通用户:默认 002022

补充

  1. umask 是 “限制” 而非 “直接设置”:它仅规定 “禁止哪些权限”,而非直接定义最终权限(最终权限由最大基础权限减去 umask 得到)。
  2. 文件与目录的区别:新文件默认永远没有执行权限(即使 umask 允许),如需执行权限,需手动用 chmod +x 添加;目录则会根据计算结果包含执行权限(否则无法进入)。
  3. 常见场景选择
    • 个人私有文件:umask 077(仅自己可访问)
    • 团队共享目录:umask 002(组内用户可读写,其他用户只读)
    • 公共目录(如 /tmp):umask 022(默认,平衡可用性和安全性)
  4. 与 chmod 的配合umask 仅控制 “新创建” 的文件权限,已有文件的权限需用 chmod 修改。

管理文件特殊权限

权限类型符号表示八进制值作用说明典型应用场景
SUIDs(用户执行位)4执行文件时临时获得文件所有者权限(通常用于普通用户执行需 root 权限的操作)/usr/bin/passwd(修改密码)
SGIDs(组执行位)2对文件:执行时临时获得文件所属组权限;对目录:新建文件继承目录所属组共享目录(如 /var/www
Sticky Bitt(其他执行位)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。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐