适用环境:macOS + 火山引擎(Volcengine)云服务器(Ubuntu 等 Linux 镜像)
本文使用示例 IP、主机名与密钥名称,请替换为你自己的信息。
写在前面
云服务器默认不让你随便登录,常见做法是 SSH + 密钥对 :
你在 Mac 上保管 私钥 ,服务器上只存 公钥。配对成功之后,可以:
- 终端远程登录服务器
- 用
scp/rsync传文件 - 用 Cyberduck 等工具图形化拖拽上传下载
- 用 Cursor / VS Code 的 Remote-SSH 远程写代码
下面以 「Mac 生成密钥 → 控制台导入公钥 → 绑定实例 → 本机配置 → 传文件」 为主线,走一遍完整流程。
一、先分清几个概念
| 名词 | 在哪 | 能不能给别人 |
|---|---|---|
| 私钥 | Mac 的 ~/.ssh/id_ed25519 |
❌ 绝对不能 |
| 公钥 | Mac 的 ~/.ssh/id_ed25519.pub |
✅ 可以上传到云平台 |
| authorized_keys | 服务器 ~/.ssh/authorized_keys |
系统自动维护,一般不用手改 |
| 密钥对(控制台) | 火山引擎「密钥对」页面 | 绑定后会把公钥注入实例 |
常见误区 :在服务器上找「本机公钥文件」------不对。正确做法是:在本机复制公钥,交给云平台或写入服务器 authorized_keys。
二、Mac 上生成 SSH 密钥
打开 终端(Terminal),执行:
bash
ssh-keygen -t ed25519 -C "your-comment"
- 提示保存路径时直接回车,默认
~/.ssh/id_ed25519 - passphrase 可留空(个人学习机)或设置密码(更安全)
查看公钥(后面要复制 整一行):
bash
cat ~/.ssh/id_ed25519.pub
输出类似:
text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your-comment
若你已有密钥且不想覆盖,可换文件名,例如
-f ~/.ssh/cloud_ed25519,后文IdentityFile改成对应路径即可。
三、火山引擎控制台:导入公钥并绑定实例
3.1 创建密钥对(导入公钥)
- 登录 火山引擎控制台
- 进入 云服务器 ECS → 密钥对
- 点击 创建密钥对
- 选择 导入公钥 (不要选「自动创建」除非你打算下载
.pem并妥善保管) - 名称 填一个好记的,例如
mac-laptop-key - 公钥内容 粘贴上一步
id_ed25519.pub的 完整一行 - 确认创建
3.2 绑定到目标实例
- 进入 实例列表,找到你的 ECS
- 更多操作 → 绑定密钥对(或实例详情里「密钥对」相关入口)
- 选择刚创建的
mac-laptop-key - 按控制台提示 重启实例(很多厂商绑定后必须重启才生效)
3.3 确认安全组放行 SSH
- 实例 → 安全组 → 入方向规则
- 确保有 TCP 22 端口放行(来源可以是你的办公 IP,学习阶段也可能是
0.0.0.0/0,生产环境请收紧)
3.4 确认登录用户名
不同镜像默认用户不同,常见:
| 镜像 | 默认 SSH 用户 |
|---|---|
| Ubuntu | ubuntu |
| CentOS | root 或 centos |
| Debian | admin 或 debian |
不确定时看控制台 远程连接 说明或镜像文档。
四、本机测试 22 端口是否可达
把 <公网IP> 换成实例详情里的 弹性公网 IP(示例用文档保留地址,勿当真):
bash
nc -zv -w 5 203.0.113.10 22
看到 succeeded 表示网络与安全组层面 22 端口通;还不代表密钥已配对成功。
五、配置 ~/.ssh/config(强烈推荐)
编辑(没有就新建)~/.ssh/config:
text
Host my-cloud-server
HostName 203.0.113.10
User ubuntu
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
说明:
Host:本机别名,随便起名,例如volc-prod、blog-serverHostName:公网 IP 或域名User:上一步确认的登录用户IdentityFile:私钥路径IdentitiesOnly yes:只用指定密钥,避免 ssh-agent 里别的 key 干扰
设置权限(SSH 要求配置文件权限够严):
bash
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/id_ed25519
六、登录测试
bash
ssh my-cloud-server
首次会提示:
text
The authenticity of host '...' can't be established.
Are you sure you want to continue connecting (yes/no)?
输入 yes 回车。成功则进入服务器 shell。
也可不依赖 config,直接:
bash
ssh -i ~/.ssh/id_ed25519 ubuntu@203.0.113.10
七、文件互传
7.1 scp(简单拷贝)
上传到服务器:
bash
scp -r ./local-folder my-cloud-server:/home/ubuntu/
从服务器下载:
bash
scp -r my-cloud-server:/home/ubuntu/remote-folder ./local-folder
7.2 rsync(推荐,支持增量与进度)
上传:
bash
rsync -avz --progress -e ssh ./local-folder/ my-cloud-server:/home/ubuntu/remote-folder/
下载:
bash
rsync -avz --progress -e ssh my-cloud-server:/home/ubuntu/remote-folder/ ./local-folder/
注意:目录同步时源路径末尾的 / 会影响「拷贝目录本身还是目录内容」,上面示例是常见写法。
7.3 图形界面:Cyberduck(Mac)
- 安装 Cyberduck
- 新建连接:SFTP
- 服务器:公网 IP,端口 22,用户名
ubuntu - SSH Private Key 选择
~/.ssh/id_ed25519 - 连接后可像 Finder 一样拖拽文件
也可导出/导入 .duck 书签文件,方便下次一键连接(书签里不要提交私钥,只存主机信息)。
八、可选:本地「待上传 / 已下载」工作区
习惯上可以在项目里建一个专用目录,例如:
text
cloud-sync/
├── to-server/ # 待上传
├── from-server/ # 已下载
└── config.json # 记录 SSH 别名、远端路径
日常流程:
- 文件丢进
to-server/ - 点脚本或小型 GUI 一键
rsync到服务器
核心仍是 SSH 别名 + rsync,GUI 只是少敲几次命令。
九、Cursor / VS Code Remote-SSH
- 安装 Remote - SSH 扩展
Cmd+Shift+P→ Remote-SSH: Connect to Host...- 选择
config里的my-cloud-server - Open Folder 选服务器上的项目目录(如
/home/ubuntu/app)
不要远程打开 ~/.ssh、~/.cursor-server 等系统目录当工程根目录。
十、常见问题排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
Connection timed out |
安全组未放行 22、IP 填错、实例未运行 | 查安全组与公网 IP |
Connection refused |
sshd 未启动或端口不是 22 | 控制台 VNC 登录检查 sshd |
Permission denied (publickey) |
公钥未绑定、未重启、User 错、本机私钥不对 | 重新绑定密钥并重启;核对 User 与 IdentityFile |
| 公钥复制不完整 | 导入时缺头缺尾、中间换行 | 重新 cat ~/.ssh/id_ed25519.pub 整行复制 |
| 绑定新密钥后密码也不能登 | 部分云厂商绑定密钥后会禁用密码登录 | 以密钥为准,或用控制台 VNC 修复 |
调试时可看详细日志:
bash
ssh -v my-cloud-server
十一、安全建议(生产环境)
- 私钥绝不进 Git、不进博客、不贴聊天窗口
- 安全组 22 端口 尽量只放行固定 IP,而不是全网开放
- 定期
ssh-keygen轮换;离职机器及时在控制台解绑旧公钥 - 服务器启用
ufw或云防火墙,只开必要端口 - 重要数据传前可打包加密,或使用
sftpover 已建立的 SSH 隧道
十二、流程小结
text
Mac 生成密钥对
↓
复制 .pub 公钥
↓
火山引擎「导入公钥」创建密钥对
↓
绑定 ECS 实例 → 重启
↓
安全组放行 TCP 22
↓
~/.ssh/config 写 Host 别名
↓
ssh 登录成功
↓
scp / rsync / Cyberduck 传文件
按以上步骤,Mac 与火山引擎 ECS 之间就能稳定建立 SSH 连接并完成文件互传。若你使用阿里云、腾讯云,控制台名词略有不同,但 「本机私钥 + 云端公钥 + authorized_keys」 这一套逻辑完全一致。
文档中的 IP(如 203.0.113.10)、主机别名(my-cloud-server)、密钥名称均为示例,请替换为你自己的环境信息。