
Linux chmod详解:轻松搞定文件权限
📷 Pixabay / PexelsLinux chmod详解:轻松搞定文件权限
八进制表示法(755、644)和符号模式(u+x)终于说清楚了。包含常见权限模式和安全注意事项。
简介
Linux系统上的每个文件和目录都有一套权限,决定谁可以读取、写入或执行它。理解这些权限是使用Linux的基础,无论是管理Web服务器、部署应用程序,还是在开发机器上整理文件。
chmod命令是修改这些权限的主要工具。尽管看起来简单,但chmod有足够的深度,即使是经验丰富的开发者有时也需要查阅参考资料。本指南涵盖了你需要了解的关于Linux文件权限和chmod命令的所有内容,从基本概念到高级特殊权限。
理解Linux文件权限
Linux文件权限围绕三种访问类型和三类用户构建。
三种权限类型
- 读取(r):查看文件内容,或列出目录内容。
- 写入(w):修改或删除文件,或在目录中添加和删除文件。
- 执行(x):将文件作为程序或脚本运行,或使用
cd进入目录。
三类用户
- 所有者(u):拥有文件的用户。默认情况下是创建文件的用户。
- 组(g):分配给文件的组。该组中的所有用户共享组权限。
- 其他人(o):系统上既不是所有者也不在文件组中的其他所有用户。
Linux系统上的每个文件恰好有一个所有者,恰好属于一个组,并且为这三个类别中的每一个定义了一套权限。
如何读取权限字符串
在终端中运行ls -l时,你会看到这样的输出:
ls -l
-rwxr-xr-- 1 alice developers 4096 Mar 22 10:30 deploy.sh
drwxr-x--- 2 alice developers 4096 Mar 22 10:30 config/
第一列是权限字符串。它有十个字符,分解如下:
d rwx r-x r--
| | | |
| | | +-- 其他人的权限(只读)
| | +------ 组的权限(读取 + 执行)
| +---------- 所有者的权限(读取 + 写入 + 执行)
+------------- 文件类型(d = 目录,- = 普通文件,l = 符号链接)
每个位置要么是权限字母,要么是表示未授予该权限的短横线(-)。以下是几个示例:
| 权限字符串 | 含义 |
|---|---|
-rw-r--r-- | 所有者可读/写。组和其他人只能读取。 |
-rwxr-xr-x | 所有者有完全访问权限。组和其他人可读取和执行。 |
drwx------ | 目录。只有所有者可读取、写入和进入。 |
-rw------- | 只有所有者可读取和写入。其他任何人都无法访问。 |
-rwxrwxrwx | 所有人都有完全访问权限。通常是安全风险。 |
八进制(数字)表示法
八进制表示法将权限表示为三位数字,其中每位数字分别对应所有者、组和其他人。每位数字是权限值的总和:
| 值 | 权限 |
|---|---|
| 4 | 读取(r) |
| 2 | 写入(w) |
| 1 | 执行(x) |
| 0 | 无权限 |
你将这些值相加得到每个用户类别的数字。例如:
- 7 = 4 + 2 + 1 = 读取 + 写入 + 执行(rwx)
- 6 = 4 + 2 = 读取 + 写入(rw-)
- 5 = 4 + 1 = 读取 + 执行(r-x)
- 4 = 4 = 只读(r--)
- 0 = 无权限(---)
因此当你看到chmod 755时,它表示:
7 = rwx(所有者:读取 + 写入 + 执行)
5 = r-x(组:读取 + 执行)
5 = r-x(其他人:读取 + 执行)
以下是所有可能数字值的快速参考:
0 = --- (无权限)
1 = --x (仅执行)
2 = -w- (仅写入)
3 = -wx (写入 + 执行)
4 = r-- (仅读取)
5 = r-x (读取 + 执行)
6 = rw- (读取 + 写入)
7 = rwx (读取 + 写入 + 执行)
如果需要在权限字符串和八进制值之间快速转换,请使用我们的chmod计算器获取即时结果。
符号表示法
符号表示法使用字母和运算符修改权限。它通常更直观,适合针对性的修改,因为不需要指定整个权限集。
语法
chmod [谁][运算符][权限] 文件
谁:
u-- 所有者(user)g-- 组o-- 其他人a-- 所有人(所有者 + 组 + 其他人)
运算符:
+-- 添加权限--- 删除权限=-- 精确设置权限
权限:
r-- 读取w-- 写入x-- 执行
符号模式示例
# 为所有者添加执行权限
chmod u+x script.sh
# 删除组和其他人的写入权限
chmod go-w config.yml
# 为所有人设置只读
chmod a=r readme.txt
# 为组添加读取和执行权限
chmod g+rx shared-tool
# 删除其他人的所有权限
chmod o= private.key
# 为所有人添加执行权限,删除其他人的写入权限
chmod a+x,o-w deploy.sh
# 设置所有者为rwx,组为rx,其他人为无
chmod u=rwx,g=rx,o= project-dir
符号表示法在只想修改权限的某一方面而不影响其他部分时特别有用。例如,chmod u+x script.sh为所有者添加执行权限,而不影响任何其他权限。
常见的chmod模式
在实际Linux管理中,某些权限模式会反复出现。以下是最重要的模式及其使用时机。
644 -- 标准文件
chmod 644 index.html
# 所有者:读取 + 写入 | 组:读取 | 其他人:读取
这是大多数普通文件的默认权限。所有者可以编辑文件,其他所有人只能读取。用于HTML文件、非敏感配置文件和一般文档。
755 -- 可执行文件和目录
chmod 755 deploy.sh
chmod 755 /var/www/html
# 所有者:完全访问 | 组:读取 + 执行 | 其他人:读取 + 执行
脚本、二进制文件和需要可访问的目录的标准权限。所有者拥有完全控制权,而其他人可以读取和执行(或在目录情况下进入),但不能修改。
700 -- 私有目录
chmod 700 ~/.ssh
# 所有者:完全访问 | 组:无 | 其他人:无
只有所有者可以访问文件或目录。对于~/.ssh或私有配置目录等敏感目录至关重要。
600 -- 私有文件
chmod 600 ~/.ssh/id_rsa
chmod 600 .env
# 所有者:读取 + 写入 | 组:无 | 其他人:无
只有所有者可以读取和写入文件。其他任何人都没有访问权限。SSH私钥、包含秘密的环境文件以及任何包含凭据的文件都需要此设置。
444 -- 所有人只读
chmod 444 LICENSE
# 所有者:读取 | 组:读取 | 其他人:读取
任何人都无法修改文件,包括所有者(除非先更改权限)。适用于不应意外编辑的文件,如许可证文件或锁定的配置。
777 -- 所有人完全访问
chmod 777 /tmp/shared-workspace
# 所有者:完全 | 组:完全 | 其他人:完全
每个用户都可以读取、写入和执行。在生产环境中避免使用。 这是重大安全风险,因为系统上的任何用户或进程都可以修改或删除文件。仅在隔离的开发或临时调试场景中使用。
快速参考表
| 八进制 | 字符串 | 典型用途 |
|---|---|---|
644 | -rw-r--r-- | 普通文件(HTML、CSS、图片) |
755 | -rwxr-xr-x | 脚本、二进制文件、Web目录 |
700 | -rwx------ | 私有目录(~/.ssh) |
600 | -rw------- | 私钥、.env文件、凭据 |
444 | -r--r--r-- | 只读文件、许可证 |
664 | -rw-rw-r-- | 组协作文件 |
775 | -rwxrwxr-x | 组协作目录 |
777 | -rwxrwxrwx | 生产环境避免使用 |
chmod命令语法和选项
chmod的完整语法为:
chmod [选项] 模式 文件...
关键选项
# 将权限递归应用于目录及其内容
chmod -R 755 /var/www/html
# 显示每个更改文件的详细输出
chmod -v 644 *.html
# 仅在发生更改时显示输出
chmod -c u+x scripts/*.sh
# 抑制错误消息
chmod -f 600 missing-file
# 使用参考文件复制其权限
chmod --reference=source.conf target.conf
实用示例
# 使脚本可执行
chmod +x backup.sh
# 保护SSH目录及其内容
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# 设置Web服务器文件权限
chmod -R 644 /var/www/html/*.html
chmod -R 755 /var/www/html/cgi-bin/
# 限制配置文件
chmod 600 /etc/myapp/database.yml
# 使目录中所有shell脚本可执行
chmod u+x scripts/*.sh
# 删除生产配置的写入访问权限
chmod a-w /etc/nginx/nginx.conf
与find结合实现精细控制
一个常见模式是在同一目录树中为文件和目录设置不同权限:
# 递归地将目录设置为755,文件设置为644
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
# 仅使shell脚本可执行
find /opt/scripts -name "*.sh" -exec chmod u+x {} \;
# 从所有配置文件中删除全局可读权限
find /etc/myapp -type f -exec chmod o-r {} \;
这种方法比chmod -R更精确,因为它可以区分文件和目录,而这两者通常需要不同的权限集。
特殊权限
除了标准的读、写、执行位之外,Linux还支持三种特殊权限类型。这些权限表示为标准三位数字前面的第四个八进制数字。
Setuid(4)
在可执行文件上设置时,文件以文件所有者而非执行用户的权限运行。
chmod 4755 /usr/bin/special-tool
chmod u+s /usr/bin/special-tool
典型示例是passwd命令。它需要修改属于root的/etc/shadow。setuid位允许任何用户以root级文件访问权限运行passwd来完成该特定目的。
在ls -l输出中,setuid文件在所有者执行位的位置显示s:
-rwsr-xr-x 1 root root 63960 Feb 10 12:00 /usr/bin/passwd
Setgid(2)
应用于目录时,在其中创建的新文件继承目录的组,而不是创建用户的主要组。在可执行文件上,它类似于setuid但用于组成员资格。
chmod 2775 /opt/team-project
chmod g+s /opt/team-project
这对于共享项目目录非常有价值。没有setgid,团队成员创建的每个文件都属于其个人组,使协作变得困难。
drwxrwsr-x 2 root developers 4096 Mar 22 10:30 /opt/team-project
注意组执行位置的s。
粘滞位(1)
在目录上设置时,即使其他用户对目录有写入访问权限,也只有文件所有者(或root)才能删除或重命名其中的文件。
chmod 1777 /tmp
chmod +t /tmp
/tmp目录是最常见的示例。每个人都可以在/tmp中创建文件,但用户无法删除彼此的文件。在ls -l输出中,粘滞位显示为其他人执行位置的t:
drwxrwxrwt 15 root root 4096 Mar 22 10:30 /tmp
特殊权限摘要
| 权限 | 八进制 | 符号 | 对文件的影响 | 对目录的影响 |
|---|---|---|---|---|
| Setuid | 4000 | u+s | 以文件所有者身份运行 | 无标准影响 |
| Setgid | 2000 | g+s | 以文件组身份运行 | 新文件继承组 |
| 粘滞位 | 1000 | +t | 无标准影响 | 只有所有者可删除文件 |
安全最佳实践
遵循几个原则将使系统保持安全,同时对日常工作保持实用性。
应用最小权限原则
只授予任务所需的最小权限。如果文件只需要被读取,就不要使其可写。如果脚本只需要由所有者运行,就不要向组或其他人授予执行权限。
# 好的做法:最小权限
chmod 600 .env
chmod 700 ~/.ssh
# 不好的做法:权限过于宽松
chmod 777 .env
chmod 755 ~/.ssh
生产环境中绝不使用777
在生产系统上使用chmod 777几乎没有合法理由。如果某些事情似乎需要它,根本问题通常是用户、组或所有权配置错误,而不是权限问题。在放宽权限之前,使用chown或chgrp修复所有权。
立即保护敏感文件
SSH密钥、API令牌、环境文件和数据库凭据应始终为600或最多640。许多工具,包括OpenSSH,如果密钥文件的权限设置过于宽松,将拒绝工作。
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
chmod 600 .env
chmod 600 /etc/myapp/secrets.yml
使用组进行协作
不要扩大"其他人"的权限,而是创建一个专用组,添加相关用户,并使用组权限。将此与共享目录上的setgid位结合,使新文件自动继承正确的组。
# 创建具有适当组权限的共享目录
sudo groupadd webteam
sudo usermod -aG webteam alice
sudo usermod -aG webteam bob
sudo mkdir /var/www/project
sudo chown root:webteam /var/www/project
sudo chmod 2775 /var/www/project
定期审计权限
在生产服务器上,定期检查具有危险权限的文件:
# 查找所有全局可写文件
find / -type f -perm -o+w 2>/dev/null
# 查找所有setuid文件(潜在的权限提升向量)
find / -type f -perm -4000 2>/dev/null
# 查找没有所有者的文件(孤立文件)
find / -nouser -o -nogroup 2>/dev/null
设置安全的umask
umask定义新创建文件和目录的默认权限。022的umask使文件为644,目录为755。更严格的027的umask使文件为640,目录为750,默认防止"其他人"访问新文件。
# 检查当前umask
umask
# 为会话设置限制性umask
umask 027
# 通过添加到~/.bashrc或~/.zshrc使其永久生效
echo "umask 027" >> ~/.bashrc
chmod vs. chown vs. chgrp
这三个命令相关但服务于不同目的:
| 命令 | 目的 | 示例 |
|---|---|---|
chmod | 更改文件权限 | chmod 755 script.sh |
chown | 更改文件所有者(可选组) | chown alice:devs file.txt |
chgrp | 更改文件组 | chgrp webteam index.html |
排查访问问题时,首先检查所有权(ls -l)和权限两者。通常解决方案是用chown更改所有权,而不是用chmod放宽权限。
使用chmod计算器
手动在符号和八进制表示法之间转换练习后会变得简单,但在设置新服务器或审查复杂权限集时可能很繁琐。使用我们的chmod计算器可视化切换权限,立即查看相应的八进制值、符号表示法和生成的chmod命令。它对于验证setuid、setgid和粘滞位等特殊权限特别有用。
结论
Linux文件权限是系统安全的基础支柱之一。chmod命令让你精确控制谁可以访问、修改和执行系统上的每个文件和目录。通过理解八进制和符号表示法、应用最小权限原则以及有效使用组,你可以在不牺牲可用性的情况下维护安全环境。
记住关键规则:将敏感文件限制为600或700,对可执行文件和公共目录使用755,在生产环境中完全避免777,并定期审计权限。有了这些实践,你的Linux系统将既功能完善又安全可靠。