欢迎光临
我们一直在努力

Linux文件权限详解:rwx、chmod、chown、umask用法与实战

ls -l 开头那串 -rw-r–r– 是每个 Linux 用户最早要啃的一块骨头。文件权限决定了谁能读、谁能写、谁能执行,而 chmod、chown、umask 就是你调整这套规则的三件套。这一篇把 rwx 的含义、数字与符号两种改法、属主属组的归属、以及新建文件默认权限的来源一次讲清。

一、先看懂 ls -l 里那串权限位

随便 ls -l 一个文件,输出长这样:

-rw-r–r– 1 zhangsan developers 1280 Sep 16 10:20 notes.txt
drwxr-xr-x 2 zhangsan developers 4096 Sep 16 10:21 docs

最前面那 10 个字符拆开看:第一位是文件类型,后面九位分三组,分别对应属主(user)、属组(group)、其他人(others)。

类型 属主 属组 其他人
– rw- r– r–

位置含义
第 1 位 文件类型:- 普通文件,d 目录,l 软链接,c/b 设备文件
第 2-4 位 属主权限:r w x
第 5-7 位 属组权限
第 8-10 位 其他人权限(既不是属主,也不在属组里)

rwx 对文件和对目录的含义不一样,这是新手最容易混的地方:

权限对文件对目录
r 能读文件内容(cat、more) 能列出目录里的文件名(ls)
w 能修改文件内容 能在目录里新建、删除、改名文件
x 能把文件当程序执行 能进入目录(cd)、能访问目录内文件的元数据

重点说一下目录的 w:目录有 w,里面的文件就能被删,不管文件本身属主是谁。这就是为什么 /tmp 要靠 Sticky Bit(下一篇讲)来防止用户互删文件。

二、chmod:改权限

语法格式

chmod [选项] 模式 文件名

模式有两种写法:数字法和符号法。

数字法

r、w、x 分别对应一个数字:r=4,w=2,x=1。把三组各自加起来,就得到一个三位数:

数字权限含义
7 rwx 读 + 写 + 执行
6 rw- 读 + 写
5 r-x 读 + 执行
4 r– 只读
0 无任何权限

所以 644 = 属主 rw-、属组 r–、其他人 r–,这也是普通文件最常见的默认权限。

chmod 644 notes.txt
chmod 755 script.sh

改完确认:

ls -l notes.txt script.sh

预期输出:

-rw-r–r– 1 zhangsan developers 1280 Sep 16 10:20 notes.txt
-rwxr-xr-x 1 zhangsan developers 128 Sep 16 10:22 script.sh

符号法

数字法是"整组重设",符号法则适合只改某一位,比如"给其他人加执行权限"。

符号说明
u / g / o / a 属主 / 属组 / 其他人 / 所有人(a 是 ugo 的缩写)
+ / – / = 增加 / 去掉 / 精确设置
r / w / x 对应权限

chmod u+x script.sh # 属主加执行权限
chmod g-w notes.txt # 属组去掉写权限
chmod o=r notes.txt # 其他人精确设为只读
chmod a+x deploy.sh # 所有人都加执行权限

一条命令里可以用逗号拼多个修改:

chmod u=rwx,g=rx,o= script.sh

末尾 o= 后面空着,表示其他人没有任何权限。

常用选项

选项说明
-R 递归修改目录下所有内容
–reference=参考文件 直接套用某个文件的权限,不自己算数字

chmod –reference=/etc/hostname notes.txt

这条在批量对齐权限时很好用,不用心算 644 还是 640。

⚠️ 常见错误

  • -R 把目录和文件一起改成 777:chmod -R 777 /var/www 会让目录里的普通文件也带 x 位,而且人人可写,等于把安全门拆了。目录一般 755,文件一般 644,分开用 find 处理:find /var/www -type d -exec chmod 755 {} \\;
    find /var/www -type f -exec chmod 644 {} \\;

  • 以为 777 能解决一切:改成 777 后服务还是起不来,多半不是权限问题,而是属主不对、SELinux/AppArmor 在拦。别一上来就 777,先查 ls -l 看属主。
  • 脚本忘了 +x:写好的 .sh 双击或 ./script.sh 报 Permission denied,十有八九是没加执行位。bash script.sh 能跑是因为它把文件当参数传给 bash,不需要 x 位。
  • 三、chown / chgrp:改属主和属组

    权限决定了"谁能怎么访问",属主属组决定了"文件归谁"。两者配合才完整。

    chown 语法

    chown [选项] 属主[:属组] 文件

    示例含义
    chown zhangsan file 只改属主为 zhangsan
    chown zhangsan:developers file 同时改属主和属组
    chown :developers file 只改属组(等价 chgrp)
    chown zhangsan: file 改属主为 zhangsan,同时把属组改成 zhangsan 的登录组

    把 /var/www 的运行权限交给 Nginx:

    sudo chown -R www-data:www-data /var/www
    ls -ld /var/www

    预期输出:

    drwxr-xr-x 4 www-data www-data 4096 Sep 16 10:30 /var/www

    -R 同样是递归。改属主通常需要 root 或 sudo,普通用户只能改自己拥有的文件的属组,而且能改的目标组还得是自己所在的组。

    chgrp

    chgrp 组名 文件 是只改组的简写,本质和 chown :组名 一样。知道就行,实际用 chown :组 的场合更多。

    ⚠️ 注意事项

    • 用冒号还是点?历史上 chown user.group 用点分隔,现在统一推荐冒号 user:group,兼容性更好。
    • 软链接本身的属主基本没意义,chown 默认会跟着链接改到指向的原文件;要改软链接自己用 -h。

    四、umask:新建文件默认权限从哪来

    每次你 touch new.txt、mkdir docs,新文件/新目录的权限是怎么定的?答案是 umask。

    原理

    系统对新建文件和目录有一套"基线权限":

    • 文件基线:666(rw-rw-rw-)
    • 目录基线:777(rwxrwxrwx)

    umask 是一个掩码,从基线里减掉对应位。注意是"减",不是直接取反:

    最终权限 = 基线权限 – umask

    看一下当前 shell 的 umask:

    umask

    预期输出(常见值):

    0022

    第一位 0 是特殊权限位(下一篇讲),后三位才是掩码。套进去算:

    • 文件:666 – 022 = 644(rw-r–r–)
    • 目录:777 – 022 = 755(rwxr-xr-x)

    这正好对应你平时 touch 和 mkdir 看到的默认值。

    查看和修改

    umask # 看数字形式
    umask -S # 看符号形式

    预期输出:

    u=rwx,g=rx,o=rx

    临时改一下(只对当前 shell 生效):

    umask 0027
    touch demo.txt && ls -l demo.txt

    预期输出:

    -rw-r—– 1 zhangsan developers 0 Sep 16 10:40 demo.txt

    027 的效果是:同组人可读不可写,其他人完全没权限。团队协作目录常用 002 或 007,让同组人新建的文件互相能改。

    永久生效

    改 ~/.bashrc(个人)或 /etc/profile、/etc/profile.d/*.sh(全局):

    # 追加到 ~/.bashrc
    umask 0027

    Ubuntu/Debian 还有个 /etc/login.defs 里的 UMASK 项控制登录时的默认值,和 shell 配置配合看。

    ⚠️ 常见误区

    • 文件没有执行位是设计如此:系统从不给新建的普通文件 x 位,防止误创建一堆可执行文件。脚本写完必须自己 chmod +x。
    • umask 000 很危险:新建文件直接 666,同组任何人都能改你的家目录文件,别图省事设成这个。

    五、知识扩展:权限信息藏在 inode 里

    ls -l 看到的 rwx,本质是从文件 inode 里的 mode 字段读出来的。想看更底层的数字表示,用 stat:

    stat notes.txt

    预期输出(节选):

    File: notes.txt
    Size: 1280 Blocks: 8 IO Block: 4096 regular file
    Device: 801h/2049dInode: 131085 Links: 1
    Access: (0644/-rw-r–r–) Uid: ( 1001/zhangsan) Gid: ( 1001/developers)

    Access: (0644/-rw-r–r–) 同时给出了八进制和符号形式,调试权限问题时 stat 比 ls -l 信息更全。

    另一个高频困惑:root 是不是无视一切权限? 基本是。root 读写几乎所有文件、进几乎所有目录都不被 rwx 拦,但有几个例外:挂载了 noexec 的分区、内核模块保护的文件、以及某些被 immutable 标签(chattr +i)锁住的文件。日常排障时记住"root 不受 rwx 限制"就够用了。

    还有个容易被忽略的点:权限只和 UID/GID 有关,和用户名无关。文件里存的是数字 UID,ls 只是临时把数字翻译成名字。如果一台机器上的用户迁到 NFS/LDAP,或者删掉重建过用户,经常会看到 ls 显示成一串数字(比如 -rw-r–r– 1 1001 1001),那就是这个 UID 在本地 /etc/passwd 里找不到名字了。

    赞(0)
    未经允许不得转载:171主机测评 » Linux文件权限详解:rwx、chmod、chown、umask用法与实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址