SFTP连接失败主因是服务器未启用SFTP子系统或用户shell被禁用;需确认sshd_config中Subsystem配置为internal-sftp、用户shell非/bin/false、Root path为绝对路径、Mappings路径映射正确、远程目录有写权限、时间戳同步或关闭比对。

PhpStorm SFTP 连接测试失败,根本不是密码问题
Connection refused 或卡在 Testing connection…,八成是服务器没开 SFTP 子系统,或用户 shell 被禁用。SSH 登录成功 ≠ SFTP 可用。
- 先在终端执行
ssh -v user@host,看到最后一行有debug1: Sending subsystem: sftp才算真正支持 SFTP - 检查服务器
/etc/ssh/sshd_config是否启用SftpSubsystem(不是Subsystem sftp /usr/lib/openssh/sftp-server就得改) - 确认该用户 shell 不是
/bin/false或/usr/sbin/nologin——哪怕只传文件,PhpStorm 也需要合法 shell 初始化会话 - Root path 必须填绝对路径,比如
/var/www/html,填~/public_html或留空会导致连接通但后续映射全错
自动上传不触发,90% 是路径映射没生效
手动 Upload to 能传,Ctrl+S 却没反应?说明 PhpStorm 根本没把当前文件纳入监听范围——它只认 Deployment > Mappings 里明确配了 Local path 的目录。
- 打开
Settings → Build, Execution, Deployment → Deployment → Mappings,确认你正在编辑的文件路径(如src/Controller/)在表格中有一行匹配项 - Local path 填相对项目根的路径(如
.或public),Deployment path on server 填相对于 Root path 的路径(如/或/static),两者拼起来必须等于完整远程路径 - Default server 必须设为你想传的目标服务器,否则勾了
Upload changed files automatically to the default server也白搭 - 别依赖通配符(如
**/vendor/**),优先写死常用目录,避免漏配dist/或build/
上传显示成功但远程文件没变,重点查三处硬性对齐
状态栏弹出 “Uploaded 1 file”,但 ls -l 看时间戳没更新、浏览器 404、内容还是旧的——这不是网络问题,是路径或权限错位。
- Web path for this project 必须和 Nginx/Apache 的
root或DocumentRoot完全一致,少一个/或多一个./都会导致文件传对位置,服务却找不到 - 远程目标目录权限必须允许你配置的 SSH 用户写入:
ls -ld /var/www/html输出中要有drwxr-xr-x里的w,且属主/属组是你用的用户名 - 如果服务器是 Docker 容器或 NFS 挂载盘,文件系统可能不更新 mtime,PhpStorm 默认靠时间戳判断是否上传,结果误判“未改动”而跳过——此时要关掉
Compare files by time stamp
私钥登录总失败,格式和密码是最大雷区
Authentication failed 弹窗反复出现?大概率是私钥格式不对,或者带了密码。
立即学习“PHP免费学习笔记(深入)”;
- PhpStorm(基于 Java)只认 OpenSSH 格式私钥,
-----BEGIN OPENSSH PRIVATE KEY-----开头;PuTTY 的.ppk文件必须用 PuTTYgen → Conversions → Export OpenSSH key 导出为无后缀文件(如id_rsa) - 导出 OpenSSH 私钥时,passphrase 务必留空——PhpStorm 对带密码的 OpenSSH 私钥支持不稳定,容易卡住或报
Invalid private key - 如果服务器强制要求密钥密码,别硬塞进 PhpStorm,改用
ssh-agent托管密钥,再让 PhpStorm 复用系统 ssh agent - 别选错文件:填的是私钥(
id_rsa),不是公钥(id_rsa.pub)
最常被忽略的是时间戳校准:本地和服务器时间差超 60 秒,PhpStorm 就会认为远程文件“更新”,直接跳过上传——跨时区部署时尤其明显。校时或关掉时间戳比对,比反复重配连接更有效。


















