Permission denied需先用ls -l查三要素:权限字符串、所有者(第三列)、所属组(第四列),再分清是缺权限(chmod)还是没资格(chown),不可混用或滥用777。
权限不足不是“加个777就能过”,而是得先分清:是没权限(chmod),还是没资格(chown)。两者不能互换,也别指望一个命令包打天下。
看到 Permission denied,先用 ls -l 看清三件事
执行 ls -l filename 或 ls -ld dirname,重点盯住三列:
- 第一列权限字符串(如
-rw-r-----):确认当前用户属于哪一类(user/group/others),再看对应位置有没有你需要的 r/w/x - 第三列所有者(如
root):你是不是这个用户?whoami对得上吗? - 第四列所属组(如
www-data):你是否在该组里?运行groups查一眼,别只看组名就默认自己在里面
常见误判:脚本报 Permission denied,但 ls -l 显示权限是 -rw-r--r--——问题不在权限数字,而在你根本不是文件所有者,也不是所属组成员,chmod 再调也没用。
chmod 改权限:目录和文件必须分开处理
递归改权限最常踩坑的地方,就是把目录和文件混着设。比如 chmod -R 755 /var/www,结果所有 .conf 和 .log 文件都带 x 位,nginx 直接拒绝加载配置。
Docker Desktop(linux)
当前 Docker 最新稳定版本之一,主要针对稳定性和兼容性进行了修复优化,适合生产环境与日常开发使用。该版本继续强化 AI 开发支持、容器日志管理以及 Docker Engine 的安全能力,对 Windows/macOS/Linux 平台兼容性进行了进一步优化。
下载
- 目录需要
x才能cd和ls,推荐统一设为755(属主全权,组和其他人可进可看) - 普通文件不需要
x,设成644更安全(属主读写,组和其他人只读) - 真要递归设权,用
find拆开:find /path -type d -exec chmod 755 {} \;find /path -type f -exec chmod 644 {} \; - 脚本文件例外:必须有
x,但别盲目a+x,优先用chmod u+x script.sh,只给属主加执行权
chown 改归属:冒号不是可有可无的装饰
chown user:group file 和 chown user file 效果完全不同。漏掉冒号,chown 会把属组改成该用户的登录组(可能是 user,也可能不是),而你真正想要的是明确指定的组。
- Web 目录协作场景:要让
deploy用户编辑、www-data进程读取,就得写sudo chown -R deploy:www-data /var/www/html - 数据库目录(如
/var/lib/mysql)必须严格匹配服务用户:属主和属组都得是mysql,否则mysqld启动失败 - 普通用户无法直接
chown别人文件,必须加sudo;但即使有sudo,目标用户也得真实存在(id target_user能查到) - 只改组不改用户?写法是
chown :www-data file,开头冒号不能少
别忘了挂载选项和 SELinux 这两个“隐身守门员”
就算 chmod 和 chown 全设对了,仍可能被拦截。这两个机制不报具体权限错误,只甩一句 Permission denied,容易让人绕弯子。
- 检查是否挂成了只读:
mount | grep $(df . | tail -1 | awk '{print $1}'),输出含ro就说明整个分区被挂载为只读,chmod无效 - SELinux 处于 enforcing 模式时,会覆盖传统权限判断。临时验证是否是它拦路:
sudo setenforce 0,如果问题消失,就得用semanage fcontext或restorecon修上下文,而不是狂调chmod - AppArmor 类似,
sudo aa-status查状态,sudo aa-disable /path/to/binary可临时绕过(仅调试用)
真正卡住的时候,往往不是权限数字错了,而是你压根没进对那扇门——要么用户身份不对,要么挂载/策略机制在背后锁死了路径。
