Skip to main content

权限管理

一、先学会看权限​

执行 ls -l,第一列就是权限信息:

ls -l
-rwxr-xr-x 1 root root 4096 Oct 17 10:00 deploy.sh
drwxr-xr-x 2 root root 4096 Oct 17 10:00 html

这一列 -rwxr-xr-x 拆开看,共 10 位:

-  rwx  r-x  r-x
│ │ │ └── 其他人(o, other)
│ │ └─────── 属组(g, group)
│ └──────────── 属主(u, user)
└──────────────── 文件类型

第一位是类型:- 普通文件,d 目录,l 软链接。

后面 9 位每 3 位一组,分别对应属主、属组、其他人,每组里的 rwx 含义:

字母含义数字
rread,读4
wwrite,写2
xexecute,执行1
-没有该权限0

所以 -rwxr-xr-x = 属主 rwx(7)、属组 r-x(5)、其他人 r-x(5),即 755。

记法:r w x 三个位置固定,有就是字母,没有就是 -,永远不会错位。

二、三个身份与三种权限​

Linux 检查文件权限时,通常先判断进程的有效用户 ID 是否匹配文件所有者;如果不匹配,再判断进程是否属于文件的所属组;都不匹配才使用 Other 权限。

重点:r w x 对文件和目录的含义完全不同,这是最容易混的地方:

权限对文件对目录
r读取文件内容(cat)列出目录里有啥(ls)
w修改文件内容在目录里新建、删除、重命名文件
x把文件当程序执行(./a.sh)进入目录(cd)、访问里面的文件

目录必须有 x 才能进入。只有 r 没有 x,你能看到文件名,但打不开;只有 x 没有 r,你能 cd 进去,但 ls 不出内容。

三、chmod:改权限​

两种写法,数字法最常用。

数字法​

三位数字依次是属主、属组、其他人,每位 = r(4) + w(2) + x(1):

chmod 755 deploy.sh    ## rwxr-xr-x
chmod 644 index.html ## rw-r--r--
chmod 600 id_rsa ## rw-------
chmod 700 ~/.ssh ## rwx------

常用取值对照:

值权限典型用途
755rwxr-xr-x目录、可执行脚本
644rw-r--r--普通文件、网页、配置
600rw-------私钥、只给自己看的文件
700rwx------私有目录(如 ~/.ssh)
777rwxrwxrwx尽量别用,谁都能改

符号法​

适合只改某一类权限:

chmod +x deploy.sh      ## 所有人加执行权限
chmod u+x deploy.sh ## 只给属主加执行
chmod g-w file ## 去掉属组的写权限
chmod o=r file ## 其他人设为只读(= 是覆盖)
chmod a+r file ## 所有人加读权限(a = u+g+o)
  • u 属主、g 属组、o 其他人、a 所有人
  • + 增加、- 移除、= 直接设定

-R 递归:chmod -R 755 html/。执行前一定确认路径,它会把整棵树都改掉。

四、chown / chgrp:改归属​

改属主(所有权),需要 sudo:

sudo chown deploy file.txt              ## 只改属主
sudo chown deploy:devops file.txt ## 同时改属主和属组
sudo chown :devops file.txt ## 只改属组
sudo chown -R www-data:www-data /var/www/html ## 递归改整个目录

只改属组也可以用 chgrp:

sudo chgrp devops /data/app

权限(rwx)和归属(谁的文件)是两件事:chmod 决定“能干什么”,chown 决定“是谁的”。

-rw-r--r--  1  alice  devops  a.txt
└── chmod ──┘ └chown┘└chgrp┘

chown 换“人”,chgrp 换“组”,chmod 换“权限”。

五、umask:新建文件的默认权限​

新建文件默认不是 777,会被 umask 减掉一部分:

umask
## 0022

touch a.txt ## 得到 644(666 - 022)
mkdir b ## 得到 755(777 - 022)

默认 umask 022 就是“其他人不能写”,一般不用改。

六、特殊权限(了解即可)​

数字法前面多一位,平时很少用:

数字名称作用
4setuid执行时临时获得属主身份,如 passwd
2setgid目录下新建文件自动继承该目录的属组,适合团队共享
1sticky目录里的文件只有本人能删,如 /tmp(1777)
sudo chmod 2770 /data/app    ## 团队共享目录:同组可读写,新建文件自动归组
ls -ld /tmp ## drwxrwxrwt,最后一个 t 就是 sticky

七、常见场景​

1. 上传的脚本不能执行

chmod +x deploy.sh
./deploy.sh

2. 部署网站后 403

sudo chown -R www-data:www-data /var/www/html
sudo chmod 755 /var/www/html
sudo find /var/www/html -type f -exec chmod 644 {} \;

3. 保护私钥

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa

4. 团队共享目录

sudo groupadd devops
sudo chgrp devops /data/share
sudo chmod 2770 /data/share ## 组内可读写,其他人无权限,新建文件自动归 devops 组

5. 日志只给自己看

chmod 600 app.log

八、避坑要点​

  1. 别用 chmod -R 777,等于把所有文件交给所有人改,是最常见的安全事故。
  2. 目录缺 x 就进不去:设成 644 的目录一律 cd 失败,看到 403 先查这个。
  3. -R 前确认路径,尤其 chmod -R / chown -R,打错一个字符可能改到系统目录。
  4. chmod 改的是权限,chown 改的是归属,两者别混。
  5. root 基本不受权限限制(普通文件的执行位除外),所以 sudo 下“改不动”往往不是权限问题,而是文件系统只读或 SELinux 之类。
  6. 脚本报 Permission denied,先看 ls -l 是否有 x,再看是否在只读目录里。

脚本执行案例​

chains@0xChains:~$ sudo chmod 754 hello.py
chains@0xChains:~$ python3 hello.py
hello Linux!!!
chains@0xChains:~$ ls -l
total 4
-rwxr-xr-- 1 deploy deploy 24 Oct 17 16:05 hello.py
chains@0xChains:~$ groups deploy
deploy : deploy sudo docker devops
chains@0xChains:~$ groups chains
chains : chains adm cdrom sudo dip plugdev users docker
chains@0xChains:~$ ^C
chains@0xChains:~$ ./hello.py
bash: ./hello.py: Permission denied

hello.py文件不属于chains用户,deploy组也不包含chains用户,其他人只能读,为何使用python3还能够运行。

这条命令的能够执行是因为:首先启动了python3解释器,解释器以chains用户的身份读取了hello.py文件,读取内容并且执行。

而直接使用./hello.py 则不行,检查到不属于deploy组也不属于其他所有者,直接拒绝了执行。

九、易错点辨析​

这一节是自查用,记录实际练习中最容易混淆的点。

1. 三个命令各改什么

命令改什么例子
chmod权限(读、写、执行)chmod 644 a.txt
chown属主,可顺带改属组chown deploy:devops a.txt
chgrp仅属组chgrp devops a.txt

chgrp 不改权限。把文件换到 devops 组后,如果组权限仍是 r--,组员照样只能读,想写还得再 chmod g+w。

2. 匹配即停:属主即使同时也在属组里,也只按属主那 3 位判断,不会把属组权限叠加进来。

3. 目录的 w 只管“目录项”:能不能新建、删除、重命名文件;修改文件内容看文件自身的 w。

4. 目录没有 x 就进不去:里面的文件即使是 777 也访问不了,403 和 Permission denied 优先查这个。

5. 2770 不是“削掉属主和属组的权限”:2 是 setgid,770 表示属主 rwx、属组 rwx、其他人 ---。

6. 770 下“其他人”并非完全看不到:新建文件默认 644、子目录 755(umask 022),组外用户仍可读、可 ls,只是不能写。要彻底隔离,需要配合严格的 umask(如 077)或 ACL。

7. 给单人授权的优先级:改属主 chown > 加入属组 + chmod g+w > 放开 o+w。646 会同时放开所有其他人,通常不是想要的效果。

8. umask 只减不加:文件基准是 666,umask 再小也不会让新文件自动带上执行位。

9. python3 hello.py 能运行、./hello.py 不行:前者只需要对文件有读权限(执行的是 python3 本身),后者要求文件自身带 x。