Linux下的权限控制

Linux 权限基础概念

在 Linux 中,权限控制是基于文件(file)和目录(directory)来实现的,权限由三组组成:

  • **User (u)**:文件的拥有者(Owner)
  • **Group (g)**:文件所属用户组
  • **Others (o)**:除拥有者和所属组外的其他用户

每组有 3 种权限:

权限 符号 对文件的作用 对目录的作用
r 读取文件内容 列出目录内容(ls)
w 修改文件内容 增删文件(即修改目录结构)
执行 x 执行文件 进入目录(cd)

权限示例:

1
drwxr-xr--
  • d → 类型:目录 (directory)
  • rwx用户 (u) 权限:读、写、执行
  • r-x用户组 (g) 权限:读、执行(不能修改目录内容)
  • r--其他人 (o) 权限:只读

chmod / chown / chgrp 的作用与用法

chmod — 改变权限

两种方式:

  1. 数字模式

    • r = 4w = 2x = 1,三者相加

    • 示例:

      1
      chmod 755 mydir

      表示:

      • 用户:7 = 4+2+1 = rwx
      • 用户组:5 = 4+0+1 = r-x
      • 其他人:5 = r-x
  2. 符号模式

    • u 用户、g 用户组、o 其他人、a 全部

    • + 添加权限、- 去掉权限、= 精确设置

    • 示例:

      1
      2
      3
      chmod u+w mydir     # 给用户增加写权限
      chmod g-x mydir # 去掉用户组的执行权限
      chmod a=r mydir # 所有人只读

chown — 改变文件/目录的拥有者

  • 格式:

    1
    chown [新用户]:[新用户组] 文件/目录
  • 示例:

    1
    2
    3
    chown root:root mydir   # 修改拥有者为 root 用户和 root 组
    chown alice myfile # 修改拥有者为 alice(组不变)
    chown :developers mydir # 修改所属组为 developers(用户不变)

chgrp — 改变文件/目录的所属组

  • 只改组:

    1
    chgrp developers mydir

常见误区

  1. 目录的 w 权限 ≠ 能修改文件内容
    • 目录的 w 是允许增加/删除文件,文件内容权限由文件本身决定。
  2. 目录的 x 权限很重要
    • 没有执行权限,即使有读权限,也无法进入目录。
  3. chmod 777 并不是万能解
    • 它会让任何人完全访问目录,风险极高,只适合临时测试环境。

Linux 中的“用户”和“服务用户”是什么

  • 在 Linux 中,用户(user)不仅仅是人登录时用的账号,比如 rootalice

  • 服务(nginx、mysql、docker 等)通常也会以独立的系统用户运行(即“服务用户”)。

    • 例如:

      1
      ps -ef | grep nginx

      你会看到 nginx 的进程是 nginx 用户运行的,而不是 root:

      1
      nginx    1234     1  0 08:00 ?    00:00:00 nginx: worker process
    • 这样做是权限最小化原则:即便被攻击,危害范围也小。

所以服务也是“用户”,只不过是系统用户(一般没有登录权限),也可以叫“角色”或“账号”。


找到谁在使用目录/文件

方法 1:用 ls -l 看文件属主

1
ls -ld /path/to/dir_or_file

例子:

1
drwxr-x---  2 mysql mysql 4096 Aug 15 08:00 /var/lib/mysql
  • 属主:mysql
  • 所属组:mysql
    → 表示这个文件(或目录)默认是 mysql 用户访问的。

方法 2:用 lsof 查看哪个进程在占用

1
lsof /path/to/dir_or_file

例子:

1
2
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1234 mysql cwd DIR 253,0 4096 1234 /var/lib/mysql
  • USER 列显示运行该进程的用户(mysql)
  • 你就知道是 mysql 服务在用它

方法 3:用 fuser 快速查看

1
fuser -v /path/to/dir_or_file

输出:

1
2
                     USER        PID ACCESS COMMAND
/path/to/file: mysql 1234 F.... mysqld
  • USER → 占用该文件/目录的用户
  • COMMAND → 占用它的程序

方法 4:查服务运行用户

如果你已经知道是某个服务(比如 nginx),可以直接查它运行的用户:

1
ps -u -p $(pidof nginx)

或者看 systemd 配置:

1
systemctl cat nginx | grep -i user

一般处理流程

  1. ls -l 确认文件或目录的属主和权限
  2. 如果是进程占用导致的权限冲突,用 lsof / fuser 找进程 → 确认运行用户
  3. 结合服务配置(systemctl / 配置文件),确认它是以哪个系统用户运行的
  4. 决定是:
    • 修改文件权限(chmod
    • 修改属主(chown
    • 或让服务用合适的用户运行