vscode连接aws ec2关键在三要素:identityfile权限须为600(windows需禁用继承并仅保留当前用户完全控制)、user须匹配系统默认(amazon linux用ec2-user,ubuntu用ubuntu)、hostname必须为当前ec2控制台显示的公网ipv4地址,任一错误均导致permission denied或超时。

VSCode 连接 AWS EC2 实例做远程代码修改,关键不在“能不能连”,而在于 IdentityFile 权限是否合规、User 是否匹配系统默认用户、以及 HostName 是否用了当前有效的公网 IP —— 三者任一出错,都会卡在连接阶段,根本进不了编辑环节。
为什么 ssh 连接总是 Permission denied (publickey)?
这是最常卡住的一步,不是密码错了,而是密钥文件本身被系统拒绝加载:
-
IdentityFile路径必须写绝对路径(Windows 用C:\Users\name\.ssh\my-key.pem,Linux/macOS 用/home/name/.ssh/my-key.pem) - Windows 下
.pem文件权限必须收紧:右键 → 属性 → 安全 → 高级 → 禁用继承 → 转换为显式权限 → 只保留当前用户“完全控制” - Linux/macOS 下执行
chmod 600 ~/.ssh/my-key.pem,否则 OpenSSH 直接忽略该密钥 - AWS 启动实例后分配的公网 IP 是动态的,每次重启可能变化,
HostName必须填当前控制台显示的 IPv4 地址,不能复用旧配置
Remote-SSH 配置里 User 和 HostName 怎么填才不踩坑?
填错 User 会导致连接成功但立即断开,或提示 “no shell”;HostName 写错则直接超时:
- Amazon Linux 2/2023 默认用户是
ec2-user,不是root或admin - Ubuntu 系统(如 AWS Marketplace 的 Ubuntu Server)默认用户是
ubuntu -
HostName不要写私有 IP(如172.31.x.x),必须是 EC2 控制台“IPv4 Public IP”那一栏的地址 - 如果启用了自定义 SSH 端口(非 22),务必在配置中加
Port 2222行,否则插件默认只试 22
连接成功后,打开文件夹却反复要输密码?
这不是认证问题,而是 VSCode 在用 SFTP 模式回传文件树时触发了二次认证 —— 实际上它本不该发生:
- 确保你没同时装
SFTP插件(如Natizyskunk.sftp),它会和 Remote-SSH 冲突,强制走密码验证 - 连接后不要点“Open Folder”再手动输密码;应该直接在远程资源管理器里右键主机 → “Connect to Host in New Window”,然后在新窗口里点“File → Open Folder”,路径填
/home/ec2-user或/home/ubuntu,这时不会弹密码框 - 如果仍弹窗,检查
~/.ssh/config里有没有漏掉StrictHostKeyChecking no,首次连接时缺少这行会卡在 host key 验证
远程终端能跑命令,但 Python/Node 插件不生效?
Remote-SSH 连接后,所有扩展默认只在本地运行。编辑器看起来在远程,但语言服务、调试器、格式化工具其实还在你本机找环境:
- 必须在远程窗口的 Extensions 面板(左侧第四个图标)里,切换到“Show Installed Extensions on SSH:xxx”标签页
- 搜索并安装
Python(ms-python.python)、Prettier(esbenp.prettier-vscode)等插件 —— 它们会部署到远程服务器的~/.vscode-server/extensions/下 - 远程 Python 解释器路径需手动指定:Ctrl+Shift+P → “Python: Select Interpreter” → 浏览到
/usr/bin/python3或/home/ec2-user/.pyenv/shims/python - 别依赖本地的
settings.json;远程项目的.vscode/settings.json才真正生效
最易被忽略的一点:AWS 安全组必须放行 TCP 22 端口,且源 IP 要允许你的本地出口 IP(或者设为 0.0.0.0/0 仅测试用)。很多人配对了密钥、填对了用户,却忘了在 EC2 控制台的安全组里开 22 端口,结果看到的永远是“connection timed out”。











