文件权限搞不定,服务起不来,数据写不进去,这种坑我踩过无数次。直接说chmod和chown怎么用,不扯理论。
先看权限长什么样
ls -l /var/log/syslog
-rw-r----- 1 syslog adm 12345 Mar 10 10:00 /var/log/syslog
第一列 `-rw-r—–` 拆开看:第1位是文件类型(`-`普通文件,`d`目录,`l`软链接),后面9位每三位一组:所有者权限、所属组权限、其他人权限。每组顺序是 r(读)、w(写)、x(执行)。
chmod改权限
两种写法:数字和符号。数字最常用,不用动脑子。
chmod 755 script.sh
7=4+2+1(rwx),5=4+0+1(r-x)。755就是所有者rwx,组和他人r-x。Linux服务器上脚本、二进制程序基本都这权限。
chmod 644 config.conf
644:所有者读写,组和他人只读。配置文件、日志文件的标准权限。
符号写法适合只改某个角色:
chmod u+x deploy.sh # 给所有者加执行
chmod g-w config.conf # 去掉组的写权限
chmod o+r public/ # 给其他人加读
目录的x权限要特别注意:没有x权限,你进不去这个目录,就算有r权限也看不到文件名。部署Web应用时,Nginx/Apache用户要能进入目录,必须给x。
chmod 755 /var/www/html
chmod 644 /var/www/html/index.html
chown改所有者
服务器上最常见的场景:你用root上传了文件,但web应用跑在www-data用户下,读写就报错Permission denied。
chown www-data:www-data /var/www/html/app.py
第一个是用户,个是组。只改用户不改组:
chown www-data /var/www/html/app.py
只改组不改用户:
chown :www-data /var/www/html/app.py
递归操作
目录下所有文件都要改,加 `-R`。但有个细节:用chmod -R 777整个目录是灾难,所有文件都变成可执行,所有用户都能写,安全漏洞。
正确做法:目录给755,文件给644。
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown递归:
chown -R www-data:www-data /var/www/html
实战:部署Python Flask应用到雨云服务器
雨云的云服务器性价比高,稳定,拿来跑业务很省心。假设用户是deploy,应用跑在app用户下。
1. 上传代码后,先看权限
ls -la /opt/myapp/
2. 如果所有者和组不对,改
sudo chown -R app:app /opt/myapp/
3. 配置文件只让所有者读写,其他人不能碰
chmod 600 /opt/myapp/.env
4. 日志目录要可写
chmod 755 /opt/myapp/logs
5. 启动脚本要可执行
chmod u+x /opt/myapp/start.sh
6. 验证
sudo -u app /opt/myapp/start.sh
如果启动成功,服务正常。如果报Permission denied,看哪个文件权限没给对。
常见翻车现场
– `chmod -R 777 /` 跑过这个的,重装系统吧。别问我怎么知道的。
– 把可执行文件权限从755改成644,结果systemd启动失败,报Exec format error。执行权限没了。
– 目录给了777,但umask导致新建文件权限不对。正确做法:目录775,文件664,配合umask 002。
– 用chown改了文件所有者,但忘了父目录的权限。用户能读写文件,但进不去目录,一样报错。
一个偷懒技巧
不想记数字,用 `stat -c %a file` 直接看当前权限的数字值。
stat -c %a config.conf
644
改之前看一眼,避免手滑。
说一句:生产环境别用777,别用root跑应用。雨云服务器默认安全组配置就挺好,配合正确的文件权限,基本不会出权限问题。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容