Linux - 4 用户管理篇(用户、组、文件属性权限)

命令 核心功能 高频参数 典型示例 适用场景
用户管理类
useradd 创建新用户 -m:自动创建用户家目录

-s Shell路径:指定登录 Shell

-r:创建系统用户(无家目录)

-u UID:指定用户 UID
1. 创建普通可登录用户:useradd -m -s /bin/bash zhangsan

2. 创建 nginx 系统用户:useradd -r -s /sbin/nologin nginx
新增团队成员登录账号、创建服务专用系统账号(如 mysql、redis)
passwd 设置 / 修改用户密码 -d:清空用户密码(无需密码登录)

-l:锁定用户账号

-u:解锁用户账号
1. 给 zhangsan 设密码:passwd zhangsan

2. 锁定用户账号:passwd -l zhangsan
新用户创建后初始化密码、用户遗忘密码时重置、临时锁定 / 解锁账号
usermod 修改已有用户属性 -aG 组名:追加用户到附加组

-d 目录:修改用户家目录

-s Shell路径:修改登录 Shell

-c 备注:添加用户备注信息
1. 把 zhangsan 加入 dev 组:usermod -aG dev zhangsan

2. 禁止用户登录:usermod -s /sbin/nologin zhangsan
用户调岗时追加 / 修改所属组、调整用户家目录、更新用户登录权限
userdel 删除用户 -r:彻底删除用户及家目录 / 邮件缓存

-f:强制删除(即使用户正登录)
1. 彻底删除用户及家目录:userdel -r zhangsan

2. 强制删除登录中用户:userdel -rf zhangsan
用户离职、账号废弃时清理账号,避免权限泄露
id 查询用户身份信息 无核心参数,直接跟用户名 1. 查看 zhangsan 的 UID/GID 及所属组:id zhangsan

2. 查看当前用户信息:id
确认用户是否存在、验证用户 UID/GID 是否正确、排查账号身份异常
su 切换用户 -:切换用户并加载其完整环境

-c 命令:切换用户执行单次命令
1. 切换到 root 并加载环境:su - root

2. 用 root 执行单次命令:su - root -c "useradd lisi"
普通用户切换到其他用户、临时用目标用户身份执行少量操作
sudo 普通用户临时提权 需配合 /etc/sudoers 配置

-l:查看当前用户可执行的 sudo 命令
1. 用 sudo 创建用户:sudo useradd wangwu

2. 查看 sudo 权限:sudo -l
普通用户执行高权限操作(如创建用户、修改系统配置),避免直接使用 root 登录
组管理类
groupadd 创建用户组 -g GID:指定组的 GID 1. 创建 dev 开发组:groupadd dev

2. 指定 GID 创建 test 组:groupadd -g 1005 test
搭建团队权限组、按业务划分用户组(如运维组、测试组)
groupdel 删除用户组 无核心参数,直接跟组名 删除无用的 test 组:groupdel test 清理空的废弃组、业务调整后删除不再使用的用户组
gpasswd 管理用户组 -a 用户名:添加用户到组

-d 用户名:从组中移除用户

-A 用户名:设置组管理员
1. 把 lisi 加入 dev 组:gpasswd -a lisi dev

2. 把 lisi 移出 dev 组:gpasswd -d lisi dev
批量管理组内用户、设置组管理员分配组管理权限
groups 查看用户所属组 无核心参数,直接跟用户名 1. 查看 zhangsan 所属组:groups zhangsan

2. 查看当前用户所属组:groups
快速验证用户是否加入目标组、排查组权限分配问题
文件权限类
chmod 修改文件 / 目录权限 数字法:r=4、w=2、x=1

-R:递归修改目录及子内容权限
1. 给文件所有者读写执行权限:chmod 700 file.txt

2. 递归开放目录权限:chmod -R 755 /data/dev
控制文件读写执行范围、开放 / 限制目录访问权限、配置程序运行权限
chown 修改文件 / 目录所有者 -R:递归修改目录及子内容所有者 1. 把文件所有者改为 zhangsan:chown zhangsan file.txt

2. 递归修改目录所有者:chown -R nginx /usr/local/nginx
文件权限交接、配置服务文件归属(如 nginx 配置文件归 nginx 用户)
chgrp 修改文件 / 目录所属组 -R:递归修改目录及子内容所属组 1. 把文件所属组改为 dev:chgrp dev file.txt

2. 递归修改目录所属组:chgrp -R dev /data/dev
团队内共享文件时,统一文件所属组,方便组内成员访问

一、用户管理

1)useradd 添加用户

useradd 是 Linux 创建新用户的命令,核心只记 2 个常用场景,无需复杂参数:

选项 英文含义 功能描述
-m(常用) create home directory 自动创建用户家目录(/home/用户名),并复制 /etc/skel 下的默认配置(如 .bashrc
-M no home directory 不创建家目录(默认行为,需显式指定)
-s(常用) shell 指定用户登录 Shell(如 /bin/bash/bin/zsh,需是 /etc/shells 中存在的 Shell)
-u user ID 指定用户的 UID(用户唯一标识,默认自动分配,0 为 root,1-999 为系统用户,1000 + 为普通用户)
-g group ID 指定用户的主组(必须是已存在的组,默认创建同名组)
-G groups 指定用户的附加组(多个组用逗号分隔,需已存在)
-c comment 添加用户注释(如用户全名、用途,会写入 /etc/passwd 的第 5 字段)
-d home directory 自定义家目录路径(默认 /home/用户名,配合 -m 生效)
-e expiration date 设置用户过期时间(格式 YYYY-MM-DD,过期后无法登录)
-f inactive days 密码过期后,账号仍可登录的天数(0 = 立即失效,-1 = 永不过期,默认 - 1)

一、创建普通用户(能登录、有家目录)

root 用户

# 1. 创建用户
useradd 用户名

# 2. 必须给用户设密码(否则无法登录)
passwd 用户名
# 添加用户到用户组group1
useradd -g group1 用户名
# 1. 创建用户(自动建家目录 /home/用户名,支持正常登录)
sudo useradd -m -s /bin/bash 用户名

# 2. 必须给用户设密码(否则无法登录)
sudo passwd 用户名
  • 示例:创建用户 zhangsan 并设密码
    sudo useradd -m -s /bin/bash zhangsan
    sudo passwd zhangsan  # 按提示输密码(无回显,输完回车)
    

二、创建系统用户(服务用,不能登录)

用于运行 nginx、mysql 等服务,无需登录权限:

sudo useradd -r -s /sbin/nologin 服务名
  • 示例:创建 nginx 服务用户
    sudo useradd -r -s /sbin/nologin nginx
    

三、关键说明

  1. 必须加 sudo(普通用户没权限创建用户);
  2. -m = 自动建家目录(普通用户必备);
  3. -s /bin/bash = 支持正常登录(否则可能无法登录);
  4. 设密码后,用 su - 用户名 可切换到该用户。

四、无权限问题

[tony@node01 ~]$ sudo useradd tonydemo

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] tony 的密码:
tony 不在 sudoers 文件中。此事将被报告。

root查看


[root@node01 ~]# tail /var/spool/mail/root
To: root@node01.localdomain
From: tony@node01.localdomain
Auto-Submitted: auto-generated
Subject: *** SECURITY information for node01 ***
Message-Id: <20251105023417.E5D763117257@node01.localdomain>
Date: Wed,  5 Nov 2025 10:34:17 +0800 (CST)

node01 : Nov  5 10:34:17 : tony : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/tony ; USER=root ; COMMAND=/sbin/useradd tonydemo

用户 tony 想在自己的家目录下,通过 sudo useradd tonydemo 创建一个新用户 tonydemo,但因为:

  1. useradd 是系统级命令,必须有 root 权限才能执行;

  2. tony 没有被授予 sudo 权限(不在 /etc/sudoers 列表里);

所以系统直接拒绝了这个操作,并且自动给 root 管理员发了一封安全告警邮件,告知 “有未授权用户尝试执行高权限操作”,方便管理员排查是否存在异常。

后续处理(可选,若需让 tony 有创建用户的权限)

如果是合法需求(比如让 tony 能创建用户),root 可以这样做:

  1. 编辑 sudoers 文件(必须用 visudo,避免语法错误导致权限问题):

    visudo
    
  2. 在文件中添加一行(授予 tony 执行 useradd 命令的权限):

    tony  ALL=(ALL)  /sbin/useradd  # 仅允许执行 useradd,更安全
    # 或 授予所有 root 权限(不推荐,风险高):tony  ALL=(ALL)  ALL
    
  3. 保存退出后,tony 再执行 sudo useradd tonydemo,输入自己的密码即可成功。

2)设置密码

passwd 用户名

3)id 查看用户是否存在

[tangge@node01 ~]$ id root
uid=0(root) gid=0(root) 组=0(root)
[tangge@node01 ~]$ id tangge
uid=1000(tangge) gid=1000(tangge) 组=1000(tangge)
[tangge@node01 ~]$ id tony
uid=1001(tony) gid=1001(tony) 组=1001(tony)

4)less /etc/passwd 查看创建的用户

less /etc/passwd
# 使用 //bin/bash 或者 /home 查看哪些是创建的用户

PixPin_2025-11-05_10-54-53

5)su 切换用户

[tony@node01 ~]$ su tangge
密码:
[tangge@node01 tony]$ pwd
/home/tony

6)who 查看登录用户信息

我用的 tony登录的会话

[tangge@node01 tony]$ who am i
tony     pts/1        2025-11-05 13:07 (192.168.49.1)
[tangge@node01 tony]$ whoami
tangge

7)sudo 临时获取 root 管理员权限

sudo(全称 superuser do)是 Linux 系统中 临时获取 root 管理员权限 的核心命令,核心价值是“安全地让普通用户执行高权限操作”,无需切换到 root 账号。以下是极简实用的用法总结,覆盖日常90%场景:

参数 英文含义 功能描述 实用示例
-i simulate initial login 模拟 root 登录环境(加载 root 的家目录、环境变量),持续使用管理员权限 sudo -i → 输入当前用户密码,进入 root 终端(提示符 #,退出用 exit
-l list privileges 列出当前用户的 sudo 授权范围(能执行哪些 root 命令) sudo -l → 输出:User tangge may run the following commands on node01: (ALL) /sbin/useradd
-u 用户名 user 以指定用户(而非 root)的身份执行命令(需授权) sudo -u tangge touch /home/tangge/test.txt → 以 tangge 身份创建文件

一、核心用法(3个必记)

1. 单条命令用 sudo 权限(最常用)

sudo 需root权限的命令
  • 示例:普通用户创建用户、修改系统配置
    sudo useradd tanggedemo  # 创建用户(之前报错的场景,授权后可用)
    sudo vim /etc/sudoers    # 编辑授权文件(需root权限)
    
  • 执行后输入 当前普通用户的密码(不是 root 密码),回车即可执行。

2. 切换到 root 环境(持续用管理员权限)

sudo -i  # 登录到 root 的完整环境,提示符变 #
  • 适合需要连续执行多个 root 命令的场景(比如批量操作系统配置);
  • 退出 root 环境:输入 exit 或按 Ctrl+D

3. 查看自己的 sudo 授权范围

sudo -l  # 列出当前用户能执行的所有 root 命令
  • 示例输出:显示“允许执行 /sbin/useradd”或“允许执行所有命令”。

二、关键知识点(避坑必备)

  1. 权限来源:普通用户能用 sudo,必须在 /etc/sudoers 文件中授权(默认只有 root 能编辑);
  2. 密码时效:输对密码后,5分钟内再次用 sudo 无需重复输密码(超时后需重新验证);
  3. 安全原则:授权时尽量“最小权限”(比如只允许用户执行 useradd,而非所有命令),避免误操作;
  4. 常见错误
    • 报错 user XXX is not in sudoers:用户未授权,需 root 编辑 /etc/sudoers 添加权限;
    • 密码输错3次:临时锁定 sudo 权限,等待几分钟后重试。

三、授权普通用户使用 sudo(管理员操作)

如果普通用户(如 tangge)需要用 sudo,root 按以下步骤授权:
1. 编辑授权文件(必须用 visudo,避免语法错误):

visudo  # 自动打开 /etc/sudoers 文件
#或者 vim /etc/sudoers    # 编辑授权文件(需root权限)

2. 添加授权行(二选一)

  • 仅允许执行 useradd 命令(推荐,安全):
    tangge  ALL=(ALL)  /sbin/useradd
    
  • 允许执行所有 root 命令(不推荐,风险高):
    tangge  ALL=(ALL)  ALL
    

3. 保存退出(vim 操作:按 Esc,输入 :wq 回车)。

授权后,tangge 即可用 sudo useradd 等命令。

8)userdel 删除用户

userdel 是 Linux 用于删除系统用户账号的命令,核心参数 -r 可同时删除用户家目录和邮件缓存,避免残留。以下是参数表格+常用示例,清晰好记:

sudo userdel 用户名 #如果 home 目录有用,一般不使用 -r 删除, 例如员工离职

一、userdel 常用参数表格

参数 英文含义 功能描述 实用示例
-r(推荐) remove home directory and mail spool 同时删除用户的家目录(/home/用户名)和邮件缓存(/var/spool/mail/用户名),彻底清理残留 sudo userdel -r tangge(删除用户 tangge 及所有相关文件)
-f force 强制删除用户(即使用户当前正登录系统,或有进程在运行) sudo userdel -rf tangge(强制删除,慎用!)
-Z remove SELinux user mapping 删除用户对应的 SELinux 安全上下文映射(仅 SELinux 启用时有效) sudo userdel -Z tangge
无参数 - 仅删除用户账号(不删家目录和邮件,会残留文件) sudo userdel tangge(不推荐,残留 /home/tangge

二、高频使用示例(必记)

1. 彻底删除用户(推荐,日常首选)

sudo userdel -r 用户名  # 如:sudo userdel -r tangge
  • 效果:删除用户账号 + 家目录(/home/tangge) + 邮件缓存(/var/spool/mail/tangge),无残留。

2. 强制删除正在登录的用户
如果用户当前正登录系统,直接删除会报错,加 -f 强制删除:

sudo userdel -rf 用户名  # 如:sudo userdel -rf tangge
  • 注意:强制删除可能导致用户正在运行的进程异常,尽量先让用户退出(pkill -u 用户名 结束用户进程)再删除。

3. 仅删除用户账号(保留家目录,特殊场景用)

sudo userdel 用户名  # 如:sudo userdel tangge
  • 适用场景:需要保留用户家目录下的文件(后续可手动备份或删除 /home/用户名)。

三、关键提醒

  1. 必须加 sudo(普通用户无权限删除用户);
  2. 优先用 -r 参数,避免残留文件占用磁盘;
  3. 若删除后想重新创建同名用户,需先手动删除残留的家目录(否则 useradd -m 会报错“目录已存在”):
    sudo rm -rf /home/用户名  # 清理残留家目录
    
  4. 无法删除当前正在使用的用户(比如 root 不能删除自己,普通用户不能删除自己),需切换到其他用户(如 root)执行。

二、用户管理组

在 Linux 中,用户组(Group) 是用于管理多个用户权限的工具——通过将用户加入同一组,可批量赋予/回收权限(如让多个用户共同访问某文件夹),避免对每个用户单独设置权限,提升管理效率。以下是用户组的核心概念、常用命令及实战示例:

2.1、用户组的核心概念

  1. 主组(Primary Group):每个用户默认有且只有一个主组,创建用户时默认生成同名主组(如创建 tangge,会自动创建 tangge 组),用户的文件默认归属主组;
  2. 附加组(Supplementary Group):一个用户可加入多个附加组,附加组的权限是对主组权限的补充(如用户 tangge 主组是 tangge,附加组是 sudodocker);
  3. 系统组 vs 普通组:系统组(GID 1-999)用于运行服务(如 nginx 组),普通组(GID 1000+)用于管理普通用户。

2.2、用户组高频命令(表格总结)

需求场景 命令 示例
1. 创建用户组 groupadd 组名 sudo groupadd dev(创建 dev 组)
2. 删除用户组 groupdel 组名 sudo groupdel dev(删除 dev 组,需组内无用户)
3. 查看所有用户组 cat /etc/groupgetent group cat /etc/group(查看系统所有组信息)
4. 查看用户所属组 groups 用户名id 用户名 groups tangge(查看 tangge 所属组)
5. 给用户添加附加组 usermod -aG 组名 用户名 sudo usermod -aG dev tangge(将 tangge 加入 dev 组)
6. 修改用户主组 usermod -g 组名 用户名 sudo usermod -g dev tangge(将 tangge 主组改为 dev
7. 查看组内所有用户 grep "组名" /etc/group grep "dev" /etc/group(查看 dev 组的用户)
8. 修改用户组名 groupmod -n 新组名 旧组名 sudo groupmod -n dev_team dev(将 dev 改名为 dev_team

2.3、实战示例(常用场景)

实战

[tangge@node01 ~]$ sudo groupadd group1
[sudo] tangge 的密码:
# 1.查看所有用户组
[tangge@node01 ~]$ cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
...
tony:x:1001:
group1:x:1002:
# 2.修改用户组 - 没权限
[tangge@node01 ~]$ usermod -g group1 tangge
usermod: Permission denied.
usermod:无法锁定 /etc/passwd,请稍后再试。
# 3.修改用户组
[tangge@node01 ~]$ sudo usermod -g group1 tangge
# 4.查看用户id
[tangge@node01 ~]$ id tangge
uid=1000(tangge) gid=1002(group1) 组=1002(group1),1000(tangge)

1. 场景1:创建组并添加多个用户(团队权限管理)
需求:创建 test_group 组,将 user1user2 加入该组,让他们共同访问 /data/test 文件夹。

# 1. 创建用户组
sudo groupadd test_group

# 2. 将用户加入附加组(-aG 避免覆盖原有附加组)
sudo usermod -aG test_group user1
sudo usermod -aG test_group user2

# 3. 验证用户是否加入组
groups user1  # 输出应包含 test_group

# 4. 设置文件夹权限(让 test_group 组有读写权限)
sudo chgrp test_group /data/test  # 改文件夹所属组为 test_group
sudo chmod 770 /data/test         # 组内用户有 rwx 权限,其他用户无权限

2. 场景2:移除用户的附加组
需求:将 user1test_group 组中移除。

# 1. 先查看用户当前所属组,确认要移除的组
groups user1

# 2. 用 gpasswd 移除(更灵活,避免手动编辑文件)
sudo gpasswd -d user1 test_group  # 输出:Removing user user1 from group test_group

# 3. 验证
groups user1  # 输出中已无 test_group

3. 场景3:修改用户主组(用户文件默认归属变更)
需求:将 user1 的主组从默认的 user1 改为 dev 组,后续 user1 创建的文件默认归属 dev 组。

# 1. 修改主组
sudo usermod -g dev user1

# 2. 验证(gid 对应的组是 dev)
id user1  # 输出:uid=1001(user1) gid=1002(dev) groups=1002(dev),...

# 3. 测试:user1 创建文件,默认归属 dev 组
su - user1
touch test.txt
ls -l test.txt  # 输出:-rw-rw-r-- 1 user1 dev ... test.txt(所属组是 dev)

四、关键注意事项

  1. 删除组的前提groupdel 只能删除“无用户”的组,若组内有用户,需先将用户移出组(或删除用户);
  2. -aG 的重要性:给用户加附加组必须用 usermod -aG-a=append,追加),若只写 -G 会覆盖原有附加组;
  3. 权限生效时机:修改用户所属组后,用户需重新登录(或执行 newgrp 组名 临时切换),权限才会生效;
  4. 系统组保护:不要删除系统默认组(如 sudorootdocker),否则会导致对应服务或权限异常。

总结

用户组的核心价值是“批量管理权限”,日常高频操作是:

  • 创建组:groupadd
  • 加用户到组:usermod -aG
  • 查用户/组关系:groups/id/cat /etc/group

通过用户组,可高效管理多用户的权限共享(如团队协作文件夹、服务权限分配),是 Linux 权限管理的核心工具之一。

三、文件属性和权限

PixPin_2025-11-05_15-33-29

dr-xr-x---. 为例,逐位解释:

  1. 第 1 位:文件类型

    • d:目录(directory),如 ....pki
    • -:普通文件(file),如 anaconda-ks.cfgdefault.conf
    • l:符号链接(link)(当前输出中没有)
    • b:块设备文件(如硬盘)
    • c:字符设备文件(如键盘)
  2. 第 2-4 位:所有者权限(u)

    所有者对该文件 / 目录的操作权限,3 位分别对应 读(r)写(w)执行(x)

    • 示例 r-x:所有者拥有「读(r=4)+ 执行(x=1)」权限,无写权限(- 表示无此权限)

    • 常见组合:rwx(完全控制)、rw-(读 + 写,无执行)、r--(仅读)

  3. 第 5-7 位:所属组权限(g)

    同组用户的操作权限,格式和含义和「所有者权限」一致:

    • 示例 r-x:所属组用户拥有「读 + 执行」权限,无写权限
  4. 第 8-10 位:其他用户权限(o)

    系统中除所有者、所属组外的其他用户的权限,格式同上:

    • 示例 ---:其他用户无任何权限(读、写、执行都禁止)

Linux 文件权限是系统安全的核心,通过控制 所有者(user)、所属组(group)、其他用户(other) 三类对象的 读(r)、写(w)、执行(x) 权限,实现文件/目录的访问控制。

1)核心基础:权限的3种对象+3种操作

1. 权限控制对象(3类)

对象 英文 含义 对应符号
所有者 User 文件/目录的创建者 u
所属组 Group 文件/目录归属的用户组 g
其他用户 Other 既不是所有者,也不在所属组的用户 o
所有对象 All 同时包含 u、g、o a

2. 权限操作(3种)

权限符号 英文 数字标识 对文件的作用 对目录的作用
r Read 4 查看内容(cat/less 列出目录文件(ls
w Write 2 修改/删除文件(vim/rm 创建/删除/移动目录内文件(touch/mv
x Execute 1 执行文件(脚本/程序) 进入目录(cd

3. 权限组合表示(数字/符号)

  • 符号格式:用 rwx 组合(缺省用 - 表示),如 rwxr-xr--(所有者 rwx、组 r-x、其他 r--);
  • 数字格式:3位数字(分别对应 u、g、o),每位是 r/w/x 的数字和(如 754 = rwxr-xr--7=4+2+1,5=4+1,4=4)。

4. 文件权限核心命令

需求场景 命令 语法/示例 关键说明
1. 查看权限 ls -l ls -l /data/test.txt 第1列是权限位,第3列所有者,第4列所属组
2. 修改权限(符号格式) chmod 给组添加写权限:chmod g+w 目标
给所有对象移除执行权限:chmod a-x 目标
+=添加,-=移除,==覆盖
3. 修改权限(数字格式) chmod 所有者 rwx、组 rw-、其他 r--:chmod 764 目标 数字顺序:u→g→o(必须3位)
4. 递归修改权限 chmod -R 递归给目录及子内容设权限:chmod -R 770 /data/share 仅对目录有效,谨慎使用(避免误改系统目录)
5. 修改文件所有者 chown 把所有者改为 tangge:chown tangge 目标 需 root 权限(sudo
6. 修改文件所属组 chgrp 把所属组改为 dev:chgrp dev 目标 等价于 chown :dev 目标
7. 同时修改所有者+所属组 chown 所有者 tangge、组 dev:chown tangge:dev 目标 递归修改:chown -R tangge:dev 目标
8. 查看文件特殊权限 ls -lstat stat /usr/bin/sudo 特殊权限(SUID/SGID/Sticky)显示在权限位第1位(如 rwsr-xr-xs 是 SUID)

2)chmod 修改文件/目录权限

chmod(英文全称 change mode)是 Linux 中 修改文件/目录权限 的核心命令,通过调整 所有者(u)、所属组(g)、其他用户(o)读(r)、写(w)、执行(x) 权限,控制文件的访问范围。以下是极简实用的用法总结,覆盖日常90%场景:

一、核心基础:权限符号与数字(必记)

1. 3类权限(r/w/x)

权限符号 功能(文件) 功能(目录) 数字标识
r 查看内容(cat/less) 列出文件(ls) 4
w 修改/删除内容(vim/rm) 创建/删除文件(touch/rm) 2
x 执行文件(脚本/程序) 进入目录(cd) 1

2. 3类控制对象

对象符号 含义
u 所有者(文件创建者)
g 所属组(文件归属组)
o 其他用户(非u非g)
a 所有用户(u+g+o)

PixPin_2025-11-05_16-51-09

3. 权限组合(符号/数字)

  • 符号组合:如 rwxr-xr--(所有者rwx、组r-x、其他r--);
  • 数字组合:3位数字(u→g→o),每位是权限数字和(如 754 = 4+2+1 / 4+1 / 4)。

二、两种修改方式(符号格式+数字格式)

1. 符号格式(易理解,推荐新手)

语法:chmod 对象±权限 目标文件/目录

chmod [{ugoa}{+-=}{rwx-}] 文件/目录

常用选项

  • -c : 若该文件权限确实已经更改,才显示其更改动作
  • -f : 若该文件权限无法被更改也不要显示错误讯息
  • -v : 显示权限变更的详细资料
  • -R(目录常用): 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)

+:添加权限;-:移除权限;=:覆盖权限(清除原有权限,只保留指定的)。

需求场景 命令示例 效果
给所有者添加执行权限 chmod u+x test.sh 所有者权限增加 x(如 rw-rwx
给所属组添加读写权限 chmod g+rw data.txt 组权限增加 r+w(如 r--rw-
移除其他用户的所有权限 chmod o-rwx public.txt 其他用户无任何权限(---
给所有用户添加读权限 chmod a+r share.txt 所有用户都能读(u/g/o均有r
覆盖所有者权限为 rwx chmod u=rwx config.sh 所有者仅保留 rwx(清除原有额外权限)
# 1. other=---
[root@node01 tangge]# ll
总用量 4
-rwxr-----. 1 root root 1102 11月  5 16:54 default.conf

# 2. other=r
[root@node01 tangge]# chmod o=r default.conf
[root@node01 tangge]# ll
总用量 4
-rwxr--r--. 1 root root 1102 11月  5 16:54 default.conf

# 3. other=rwx,(顺序好像不重要)
[root@node01 tangge]# chmod o=rxw default.conf
[root@node01 tangge]# ll
总用量 4
-rwxr--rwx. 1 root root 1102 11月  5 16:54 default.conf

# 4.设置  other=w(写)
[root@node01 tangge]# chmod o=w default.conf
[root@node01 tangge]# ll
总用量 4
-rwxr---w-. 1 root root 1102 11月  5 16:54 default.conf

# 5. other在w的基础上+r(读)
[root@node01 tangge]# chmod o+r default.conf
[root@node01 tangge]# ll
总用量 4
-rwxr--rw-. 1 root root 1102 11月  5 16:54 default.conf

2. 数字格式(高效,运维常用)

语法:chmod 数字组合 目标文件/目录(数字顺序:u→g→o)

常用数字组合 rwx 二进制 符号对应 适用场景 命令示例
754 111|101|100 rwxr-xr-- 所有者可读写执行,组可读执行,其他只读 chmod 754 app.sh
770 111|111|000 rwxrwx--- 所有者和组可读写执行,其他无权限(团队协作) chmod 770 team_dir/
644 110|100|100 rw-r--r-- 所有者可读写,其他只读(普通文件) chmod 644 note.txt
777 rwxrwxrwx 所有用户可读写执行(慎用,安全风险) chmod 777 temp_dir/
444 100|100|100 r--r--r-- 所有用户只读(禁止修改) chmod 444 readme.txt

三、高频实战示例

1. 给脚本添加执行权限(最常用)

chmod u+x run.sh  # 仅所有者可执行
# 或 所有用户可执行(如公共脚本)
chmod a+x run.sh

2. 递归修改目录及子内容权限(团队共享目录)

# 递归给 team_dir 及子文件设权限:所有者和组可读写执行,其他无权限
sudo chmod -R 770 team_dir/
  • -R:递归(Recursive),仅对目录有效,会修改目录下所有文件/子目录权限。

3. 修复文件“只读”问题(添加写权限)

chmod u+w edit.txt  # 给所有者添加写权限,可修改文件

4. 禁止其他用户访问文件

chmod o-rwx private.txt  # 移除其他用户的所有权限

四、关键注意事项

  1. 权限优先级:所有者权限 > 所属组权限 > 其他用户权限;
  2. 目录必须有x权限:目录没有 x 权限时,即使有 r 权限,也无法 cd 进入,ls 只能看到文件名(无详情);
  3. 普通用户权限限制:只能修改自己拥有的文件/目录权限,修改他人文件需 sudo(root 权限);
  4. 慎用 777:所有用户可读写执行,可能导致文件被恶意修改(仅临时测试用);
  5. 递归修改谨慎chmod -R 不要用于 /etc/bin 等系统目录,会导致系统崩溃。

总结

chmod 核心用法:

  • 新手用 符号格式(如 chmod g+rw 目标),易理解;
  • 熟手用 数字格式(如 chmod 754 目标),高效;
  • 目录递归修改加 -R,系统目录禁用递归。

简单记:chmod + 权限组合 + 目标,按“最小权限原则”授权(只给需要的权限)。

3)chown 改文件/目录的所有者

chown(英文全称 change owner)是 Linux 中 修改文件/目录的所有者(owner)和所属组(group) 的核心命令——简单说就是“变更文件/目录的归属权”,需 root 权限(sudo)执行,日常用于权限交接、团队协作等场景。以下是极简实用的用法总结:

一、核心语法(3种常用格式)

# 1. 仅修改所有者(格式:chown 新所有者 目标)
sudo chown 用户名  文件/目录

# 2. 仅修改所属组(格式:chown :新所属组 目标)
sudo chown :组名  文件/目录

# 3. 同时修改所有者+所属组(格式:chown 新所有者:新所属组 目标)
sudo chown 用户名:组名  文件/目录
  • 关键:必须加 sudo(普通用户无权修改他人文件的归属权);
  • 递归修改(目录及子内容):加 -R 参数(Recursive)。

选项 :

  • -R, --recursive: 递归更改目录及其子目录中所有文件的所有者
  • -v, --verbose: 显示详细操作信息
  • -c, --changes: 只显示实际发生更改的文件
  • -f, --silent, --quiet: 抑制错误信息
  • --reference=文件: 使用参考文件的所有者和组设置
  • -h, --no-dereference: 影响符号链接本身,而不是链接指向的文件
  • --from=当前所有者: 只有当前所有者匹配时才更改

二、高频实战示例(覆盖90%场景)

1. 仅修改文件所有者

需求:把 /home/tangge/note.txt 的所有者改为 user1

sudo chown user1 /home/tangge/note.txt
# 验证(第3列变为 user1)
ls -l /home/tangge/note.txt

2. 仅修改目录所属组

需求:把 /data/share 的所属组改为 dev 组(团队协作,让组内用户有权访问)

sudo chown :dev /data/share
# 验证(第4列变为 dev)
ls -l /data | grep share

3. 同时修改所有者和所属组

需求:把 /opt/project 的所有者改为 user2,所属组改为 test_group

sudo chown user2:test_group /opt/project
# 验证
ls -l /opt | grep project

4. 递归修改目录及所有子内容(重点)

需求:把 /home/user1 及里面所有文件/子目录的所有者和所属组,统一改为 user1:user1(修复误改的归属权)

sudo chown -R user1:user1 /home/user1
# 验证子文件(所属者和组均为 user1)
ls -l /home/user1/test.txt

三、关键注意事项

  1. 所有者/组必须存在:修改后的用户名、组名必须是系统中已存在的(用 id 用户名grep 组名 /etc/group 验证),否则报错“无效的用户”“无效的组”;
  2. 递归修改谨慎用-R 会修改目录下所有内容,避免对 /etc/bin 等系统目录使用(会导致系统权限混乱);
  3. 软链接的特殊处理chown 默认只修改软链接本身的归属权,不影响源文件;若想修改源文件,需加 -L 参数(chown -L 用户名 软链接名);
  4. 普通用户的限制:普通用户只能修改自己拥有的文件的归属权(且只能转给其他存在的用户),修改他人文件必须用 sudo

四、常见错误与解决

错误提示 原因 解决方法
chown: 无效的用户: 'user3' 用户名 user3 不存在 先创建用户:sudo useradd user3,再执行 chown
chown: 无法访问 '/data/share/file.txt': 权限不够 普通用户无权限修改 sudosudo chown user1 /data/share/file.txt
chown: 递归操作时不能操作 '/proc/1': 是目录 对系统特殊目录用了 -R 停止操作,仅对自定义目录(如 /data/home)用 -R

总结

chown 核心用途是“变更文件/目录归属”,日常高频用法:

  • 单独改所有者:sudo chown 用户名 目标
  • 单独改所属组:sudo chown :组名 目标
  • 递归改目录:sudo chown -R 用户名:组名 目录

记住“先验证用户/组存在,再执行命令”,避免权限错误。

4)chgrp 专门修改文件/目录所属组

chgrp(英文全称 change group)是 Linux 中 专门修改文件/目录所属组 的命令——功能单一且精准,无需像 chown 那样兼顾所有者,仅聚焦“所属组变更”,适合团队权限协作场景。以下是极简实用的用法总结:

一、核心语法(2种常用格式)

# 1. 基础用法:修改目标的所属组
sudo chgrp 新组名  文件/目录

# 2. 递归用法:修改目录及所有子文件/子目录的所属组(重点)
sudo chgrp -R 新组名  目录
  • 关键:必须加 sudo(普通用户无权修改文件的所属组);
  • 等价关系:chgrp 组名 目标chown :组名 目标(两者功能完全一致,chgrp 更直观)。

选项 :

  • -R, --recursive: 递归更改目录及其子目录中所有文件的所有者

二、高频实战示例

1. 修改单个文件的所属组

需求:把 /home/tangge/report.txt 的所属组改为 dev 组(让 dev 组用户有权访问)

sudo chgrp dev /home/tangge/report.txt
# 验证(第4列变为 dev)
ls -l /home/tangge/report.txt

2. 修改目录的所属组(团队协作常用)

需求:把 /data/team_project 的所属组改为 test_group,组内用户可共享访问

sudo chgrp test_group /data/team_project
# 验证(第4列变为 test_group)
ls -l /data | grep team_project

3. 递归修改目录及所有子内容

需求:把 /opt/docs 及里面所有文件/子目录的所属组,统一改为 doc_group

sudo chgrp -R doc_group /opt/docs
# 验证子文件(所属组均为 doc_group)
ls -l /opt/docs/readme.md

4. 结合 chmod 配置组权限(完整协作流程)

需求:dev 组内用户可读写 /data/share 目录,步骤如下:

# 1. 创建 dev 组(若未创建)
sudo groupadd dev

# 2. 把目录所属组改为 dev
sudo chgrp dev /data/share

# 3. 给 dev 组添加 rwx 权限
sudo chmod g+rwx /data/share

# 4. 验证(权限位为 drwxrwxr--,所属组为 dev)
ls -l /data | grep share

三、关键注意事项

  1. 目标组必须存在:修改后的组名必须是系统中已存在的(用 grep 组名 /etc/group 验证),否则报错“无效的组”;
  2. 递归参数 -R 慎用:仅对自定义目录(如 /data/home)使用,避免对 /etc/bin 等系统目录递归修改(会导致系统权限混乱);
  3. 软链接的特殊处理chgrp 默认只修改软链接本身的所属组,不影响源文件;若想修改源文件,需加 -L 参数(chgrp -L dev 软链接名);
  4. chown 的区别chgrp 仅改所属组,chown 可改所有者+所属组,日常单纯改组用 chgrp 更清晰。

四、常见错误与解决

错误提示 原因 解决方法
chgrp: 无效的组: 'dev_team' 组名 dev_team 不存在 先创建组:sudo groupadd dev_team,再执行 chgrp
chgrp: 无法访问 '/data/share/file': 权限不够 普通用户无权限修改 sudosudo chgrp dev /data/share/file
chgrp: 递归操作时跳过目录 '/sys/xxx': 不允许的操作 对系统特殊目录用了 -R 停止操作,仅对自定义目录使用递归

总结

chgrp 核心用途是“单独修改所属组”,日常高频用法:

  • 改单个文件/目录:sudo chgrp 组名 目标
  • 递归改目录:sudo chgrp -R 组名 目录
  • 配合 chmod 实现团队权限共享(先改组,再设组权限)。

简单记:chgrp = 专门改所属组的命令,直观且不易出错。

posted @ 2025-11-05 10:46  【唐】三三  阅读(79)  评论(0)    收藏  举报