permission denied 是远端 ssh 用户(如 www-data 或 deploy)对目标目录无写权限;需确保其属组正确、目录设 setgid 位(chmod g+s)、selinux 上下文适配,且 upload_tmp_dir 等 php 运行路径同样赋权。

上传失败时看到 Permission denied 到底在拒绝谁?
不是你本地没权限,是远端 SSH 用户(比如 www-data 或 deploy)对目标目录没有写权限。PhpStorm 的 SFTP 上传走的是该用户身份,它只能操作自己所属组有写权限的目录,或自己拥有写权限的文件。常见错误现象是:文件列表能刷新、下载正常,但一上传就卡住几秒后报 Permission denied 或 Failed to create file。
改目录所属组不能只用 chgrp,必须配合 chmod g+s
单纯执行 chgrp www-data /var/www/html 不够——新上传的文件仍会属于上传用户的主组(比如 deploy),而非 www-data。关键一步是设置 setgid 位:
chgrp www-data /var/www/html-
chmod g+s /var/www/html(让新创建文件自动继承目录所属组) -
chmod 775 /var/www/html(确保组成员可读写执行)
漏掉 g+s,下次上传的文件依然属 deploy:deploy,Nginx/Apache 还是读不到。
PhpStorm 的 SFTP 配置里别信“测试连接成功”就万事大吉
连接测试只验证 SSH 登录和目录列表,不校验写权限。必须手动触发一次上传(比如新建一个空 test.txt 并保存)才能暴露问题。检查点包括:
- 远端用户是否在目标组中?运行
groups确认输出含www-data - 目录父路径(如
/var/www)是否也具备执行权限?否则无法进入html - SELinux 是否启用?
ls -Z /var/www/html若显示httpd_sys_content_t,需改为httpd_sys_rw_content_t:sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html(/.*)?",再restorecon -Rv /var/www/html
上传后文件属主仍是远端用户,但属组正确才真正生效
你不需要、也不应该把文件属主改成 www-data(有安全风险)。只要属组正确 + 组有写权限 + web 服务配置为以该组运行(如 Apache 的 Group www-data),PHP 脚本就能读写生成的缓存、日志、上传文件。容易被忽略的是:upload_tmp_dir 和 session.save_path 这类 PHP 运行时路径,同样要按相同逻辑赋权——它们才是实际写入失败的高发区。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










