linux shell

关注公众号 jb51net

关闭
首页 > 脚本专栏 > linux shell > Linux文件权限命令rwx、chmod、chown、umask

Linux文件权限命令之rwx、chmod、chown、umask用法与实战

作者:程序员Benothing

文件权限决定了谁能读、谁能写、谁能执行,而 chmod、chown、umask 就是你调整这套规则的三件套,这一篇把 rwx 的含义、数字与符号两种改法、属主属组的归属、以及新建文件默认权限的来源一次讲清,需要的朋友可以参考下

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。把三组各自加起来,就得到一个三位数:

数字权限含义
7rwx读 + 写 + 执行
6rw-读 + 写
5r-x读 + 执行
4r–只读
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。

常见错误

  1. -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 {} \;
  1. 以为 777 能解决一切:改成 777 后服务还是起不来,多半不是权限问题,而是属主不对、SELinux/AppArmor 在拦。别一上来就 777,先查 ls -l 看属主。
  2. 脚本忘了 +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 :组 的场合更多。

注意事项

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

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

原理

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

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

最终权限 = 基线权限 - umask

看一下当前 shell 的 umask:

umask

预期输出(常见值):

0022

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

这正好对应你平时 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 配置配合看。

常见误区

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

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

stat notes.txt

预期输出(节选):

  File: notes.txt
  Size: 1280       	Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d	Inode: 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 里找不到名字了。

以上就是Linux文件权限命令之rwx、chmod、chown、umask用法与实战的详细内容,更多关于Linux文件权限命令rwx、chmod、chown、umask的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文