Linux 文件权限设置教程:chmod、chown 命令实操与 Permission denied 常见问题

一、适用场景:什么时候需要修改文件权限

Linux 文件权限是站长和运维日常打交道最多、也最容易踩坑的基础问题。典型场景有四种:一是网站部署完成后,日志或浏览器里反复出现 Permission denied,Nginx、PHP 无法读取或写入站点文件;二是通过 SFTP 上传的文件,网站程序读不到,或者反过来网站生成的文件、日志,你用 FTP 客户端下载不下来;三是上传了脚本或程序,执行时提示 Permission denied 或 bad interpreter,原因是缺少可执行权限;四是做安全加固时,需要把过宽的权限(比如图省事设置的 777)收回到合理范围,降低被篡改、被挂马的风险。

需要特别提醒的是,权限操作涉及的是线上业务文件。建议在修改之前,先用 stat 命令把关键目录和文件的当前权限记录下来,重要站点先做一次备份;批量递归修改(-R)更要谨慎,先在一两层目录上验证效果,确认无误后再扩大到全站。生产环境切忌直接对根目录或站点根目录执行大范围的权限变更。

二、权限基础:r、w、x 与 755、644 的含义

在 Linux 中,每个文件和目录都有三组权限位,分别对应所有者(user)、所属组(group)和其他人(others)。每组用 r、w、x 三个字母表示读、写、执行。用 ls -l 查看时,最前面那一串字符就是权限信息:

ls -l /www/wwwroot/example.com
-rw-r--r-- 1 www www 1204 10月 20 09:00 index.php
drwxr-xr-x 2 www www 4096 10月 20 09:00 uploads/

上面第一行表示 index.php 是普通文件,所有者可读写、所属组和其他人只读;第二行表示 uploads 是目录,所有者可读写可进入,所属组和其他人可读可进入。把 r、w、x 换算成数字就是:r=4、w=2、x=1,三者相加得到该组的权限值,三组数字连起来就是常见的三位或四位权限码,例如 755(rwxr-xr-x,所有者完全控制,其他人读和执行)、644(rw-r--r--,所有者读写,其他人只读)、600(rw-------,仅所有者可读写)。

理解目录和文件权限的区别很关键:对目录来说,r 表示能列出文件名,x 表示能进入该目录(没有 x 即使有 r 也进不去),w 表示能在里面新建和删除文件;对文件来说,r 是能看内容,w 是能改内容,x 是能作为程序执行。一般的经验值是:目录设 755,文件设 644,脚本和可执行程序加执行权限,私密配置文件(如数据库连接配置)收紧到 600。

三、实操第一步:用 chmod 修改文件权限

chmod 支持数字和符号两种写法,日常使用数字写法最直观。修改单个文件的权限、把脚本改成可执行,命令如下:

# 把文件改为所有者可读写、其他人只读
chmod 644 index.php
# 把目录改为 755(所有者完全控制,其他人可进入可读)
chmod 755 uploads
# 给脚本添加所有者的执行权限
chmod u+x deploy.sh
# 递归修改整个站点目录(务必先确认路径正确)
chmod -R 755 /www/wwwroot/example.com

符号写法适合做精细调整,例如 chmod o-rwx config.php 表示去掉其他人的全部权限,比直接设置 600 更不容易误伤;chmod g+w runtime/ 只给所属组开放写权限。对于 WordPress、宝塔面板这类网站目录,推荐的标准做法是:先用 find 按类型批量规范,再单独给需要写入的目录(如上传目录、缓存目录、日志目录)开放写权限。

# 目录统一 755、文件统一 644,再单独放开上传目录
find /www/wwwroot/example.com -type d -exec chmod 755 {} \;
find /www/wwwroot/example.com -type f -exec chmod 644 {} \;
chown -R www:www /www/wwwroot/example.com/wp-content/uploads
Linux 终端命令行代码屏幕特写
Linux 终端中执行 chmod 与 chown 命令的界面示意

四、实操第二步:用 chown 修改文件所有者

很多 Permission denied 并不是权限位不够宽,而是所有者不对。最常见的例子:用 root 账号通过 SFTP 上传文件,文件所有者是 root,而网站进程以 www(宝塔面板默认,部分系统是 nginx、apache 或 www-data)身份运行,属于"其他人",一旦目录权限是 755、文件是 644,网站就写不进去。先用下面的命令确认当前所有者和运行用户:

# 查看文件所有者与所属组
ls -l /www/wwwroot/example.com
# 查看网站进程以哪个用户运行
ps aux | grep nginx | grep -v grep
ps aux | grep php-fpm | grep -v grep

确认网站进程运行在 www 用户后,把站点文件的所有者和所属组改成 www:

# 修改整个站点目录的所有者(-R 为递归)
chown -R www:www /www/wwwroot/example.com

如果站点由多个系统用户协同维护(比如部署用户和网站用户不同),不要简单地把所有文件改成 777,更稳妥的做法是把维护用户加入网站所属组,再用 chmod -R g+w 授予组写权限。改完之后再次用 ls -l 抽查几个关键文件,并用浏览器实际访问网站、触发一次上传或写缓存的操作,验证权限是否真的满足业务需要。

五、常见问题(FAQ)

问题一:chmod 777 是不是更省事,为什么都说不要用?777 意味着任何人(包括网站进程、其他用户甚至被入侵的恶意程序)都能读写执行该文件。一旦网站存在上传漏洞,攻击者可以直接写入或替换文件,挂马、篡改主页会变得非常容易。正确做法是按最小权限原则:目录 755、文件 644,只给真正需要写入的目录和用户授权。

问题二:权限看起来没问题,为什么还是 Permission denied?常见原因有四类:上级目录缺少 x 权限导致路径无法进入;文件系统以只读方式挂载(用 mount | grep ro 或 touch 测试);开启了 SELinux 或 AppArmor,用 ls -Z 查看安全上下文,必要时执行 restorecon -R 恢复默认标签;文件被进程占用或设置了不可变属性(lsattr 查看)。逐一排查即可定位。

问题三:SFTP 上传后文件变成 600,网站读取不到怎么办?这是部分 SFTP 服务的默认 umask 或客户端设置导致的。上传后用 chmod 644 修正文件权限,目录用 chmod 755;也可以在 SFTP 客户端里把默认权限改成 644,一次性解决。如果是宝塔面板,还可以在面板的"文件"菜单里直接右键修改权限。

问题四:误操作执行了 chmod -R 777,怎么恢复?不要慌张,也尽量不要反复乱试。恢复思路是按前面第四节的做法重新规范:目录递归 755、文件递归 644,再用 chown -R www:www 修正所有者,之后重点检查上传、缓存、日志这几个需要写权限的目录,按需补授。如果服务器上有可用的备份,也可以从备份恢复目录结构后再统一设置。长远建议:执行批量权限命令前先在测试目录验证,重要的站点保留一份权限基线记录。

六、总结

Linux 文件权限并不复杂,记住三句话就能解决大部分问题:权限位先看 r、w、x 与所有者,目录默认 755、文件默认 644,写权限只按需最小授予。遇到 Permission denied 时,先用 ls -l 确认权限和所有者是否正确,再用 chmod 调权限位、用 chown 调所有者,最后从浏览器端实际验证一次。养成为操作前备份、为关键变更留记录的习惯,远比记住多少条命令更重要。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容