1. 项目概述
作为一名长期使用VS Code进行远程开发的程序员,我深知配置SFTP和SSH密钥连接的重要性。本文将详细介绍如何在VS Code中配置无密码SFTP远程服务器连接,以及如何使用SSH密钥直接连接远程服务器(WSL版本)。这些配置不仅能提高工作效率,还能增强连接的安全性。
在实际开发中,频繁输入密码既麻烦又不安全。通过SSH密钥认证,我们可以实现一键登录,同时避免密码泄露的风险。本文将手把手教你完成整个配置过程,包括密钥生成、权限设置、VS Code插件配置等关键步骤。
2. 环境准备与基础配置
2.1 生成SSH密钥对
首先我们需要生成SSH密钥对,这是实现无密码登录的基础。在WSL终端中执行以下命令:
bash复制ssh-keygen -t rsa -b 4096
这个命令会生成一对RSA密钥(公钥和私钥),密钥长度4096位提供了足够的安全性。执行过程中,系统会提示你选择密钥保存位置(默认是~/.ssh/id_rsa)和设置密码短语(可选)。
提示:虽然可以跳过密码短语设置,但建议设置一个强密码短语来保护你的私钥,这样即使私钥泄露,攻击者也无法直接使用它。
2.2 设置正确的密钥权限
生成密钥后,必须确保私钥文件的权限设置正确。私钥文件(~/.ssh/id_rsa)的权限必须是600,这意味着只有所有者有读写权限:
bash复制chmod 600 ~/.ssh/id_rsa
同时,.ssh目录的权限应该是700:
bash复制chmod 700 ~/.ssh
这些严格的权限设置是SSH协议的安全要求,如果权限设置不正确,SSH客户端会拒绝使用这些密钥。
3. 配置SFTP远程服务器连接
3.1 安装SFTP插件
在VS Code中,我们需要安装"SFTP"插件来实现文件同步功能。打开VS Code的扩展市场,搜索"SFTP"并安装由liximomo开发的SFTP扩展。
3.2 配置SFTP连接
安装完成后,我们需要创建SFTP配置文件。在项目根目录下创建.vscode/sftp.json文件,内容如下:
json复制{
"name": "yuelushan",
"host": "172.22.xxx.xxx",
"protocol": "sftp",
"uploadOnSave": true,
"useTempFile": false,
"port": 30680,
"username": "root",
"privateKeyPath": "/home/mapengsen/.ssh/id_rsa",
"ignore": [
".vscode",
".git",
".DS_Store",
".github/**",
".ci"
],
"context": "./",
"remotePath": "111111",
"watcher": {
"files": "**/*",
"autoUpload": true,
"autoDelete": true
},
"remoteExplorer": {
"filesExclude": [
".git",
".vscode",
".github"
]
},
"profiles": {},
"downloadOnOpen": false
}
这个配置文件的主要参数说明:
- name: 连接名称,可以自定义
- host: 远程服务器IP地址
- port: SSH端口号(默认是22,这里使用了30680)
- username: 登录用户名
- privateKeyPath: 私钥文件路径
- remotePath: 远程服务器上的工作目录
- uploadOnSave: 保存文件时自动上传
- autoUpload: 文件变更时自动上传
- autoDelete: 本地删除文件时远程也同步删除
3.3 上传公钥到服务器
在配置SFTP之前,我们需要将公钥上传到服务器,实现无密码认证:
bash复制ssh-copy-id -p 30680 -i ~/.ssh/id_rsa.pub root@172.22.xxx.xxx
这个命令会将公钥(~/.ssh/id_rsa.pub)内容添加到远程服务器的~/.ssh/authorized_keys文件中。如果ssh-copy-id不可用,也可以手动完成这个过程:
- 复制本地~/.ssh/id_rsa.pub文件内容
- 登录远程服务器
- 编辑~/.ssh/authorized_keys文件(如不存在则创建)
- 粘贴公钥内容并保存
4. 配置SSH直接连接远程服务器
4.1 配置SSH Config文件
为了方便直接通过SSH连接服务器,我们可以配置本地的SSH Config文件。编辑~/.ssh/config文件(如不存在则创建),添加以下内容:
code复制Host yuelushan
HostName 172.22.xxx.xxx
User root
Port 30680
IdentityFile ~/.ssh/id_rsa
配置说明:
- Host: 服务器别名,可以自定义
- HostName: 服务器IP地址
- User: 登录用户名
- Port: SSH端口号
- IdentityFile: 私钥文件路径
配置完成后,就可以使用简化的命令连接服务器了:
bash复制ssh yuelushan
4.2 测试SSH连接
配置完成后,建议先测试SSH连接是否正常工作:
bash复制ssh -T root@172.22.xxx.xxx -p 30680
如果配置正确,你应该可以直接登录服务器而无需输入密码。
5. 常见问题与解决方案
5.1 连接超时或拒绝
如果遇到连接问题,首先检查:
- 服务器IP和端口是否正确
- 服务器SSH服务是否正常运行
- 防火墙是否放行了指定端口
可以使用telnet测试端口连通性:
bash复制telnet 172.22.xxx.xxx 30680
5.2 权限相关问题
如果遇到"Permissions are too open"之类的错误,说明密钥文件权限设置不正确。确保:
- 私钥文件权限是600
- .ssh目录权限是700
- authorized_keys文件权限是600
5.3 SFTP上传失败
如果SFTP上传失败,检查:
- privateKeyPath配置是否正确
- 远程目录是否有写入权限
- 磁盘空间是否充足
可以在VS Code的输出面板中选择"SFTP"查看详细的错误信息。
5.4 中文文件名乱码
如果遇到中文文件名乱码问题,可以在sftp.json中添加:
json复制"encoding": "utf8"
6. 高级配置与优化
6.1 多服务器配置
如果你需要管理多个服务器,可以在.ssh/config中为每个服务器创建独立的配置块,并为每个服务器生成不同的密钥对以提高安全性。
示例:
code复制Host server1
HostName 192.168.1.100
User user1
Port 22
IdentityFile ~/.ssh/server1_key
Host server2
HostName 192.168.1.101
User user2
Port 2222
IdentityFile ~/.ssh/server2_key
6.2 保持连接活跃
SSH连接可能会因为长时间空闲而断开,可以在.ssh/config中添加以下配置防止断开:
code复制Host *
ServerAliveInterval 60
ServerAliveCountMax 3
6.3 使用SSH Agent管理密钥
为了避免每次都需要输入密钥密码,可以使用ssh-agent管理密钥:
bash复制eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
这样只需要在会话开始时输入一次密码短语即可。
7. 安全注意事项
- 私钥文件相当于密码,必须妥善保管,不要分享给他人
- 建议为不同的服务器使用不同的密钥对
- 定期轮换密钥(建议每3-6个月更换一次)
- 如果密钥可能已经泄露,立即从服务器的authorized_keys中删除对应的公钥
- 在服务器上,确保authorized_keys文件的权限是600
8. 性能优化建议
- 对于大型项目,可以调整SFTP的并发上传数量
- 如果网络延迟较高,可以增大TCP缓冲区大小
- 对于频繁修改的小文件,可以适当调整watcher的轮询间隔
在sftp.json中添加:
json复制"concurrency": 4,
"tcpNoDelay": true,
"watcher": {
"files": "**/*",
"autoUpload": true,
"autoDelete": true,
"pollInterval": 15000
}
9. 实际使用技巧
- 使用VS Code的远程资源管理器可以方便地浏览远程文件
- 右键点击文件或文件夹可以选择"Download"或"Upload"进行手动同步
- 使用"SFTP: Sync Local -> Remote"命令可以一次性同步所有修改过的文件
- 配置不同的profiles可以快速切换不同的部署环境
示例profiles配置:
json复制"profiles": {
"production": {
"remotePath": "/var/www/production"
},
"staging": {
"remotePath": "/var/www/staging"
}
}
10. 替代方案比较
除了SFTP插件,VS Code还提供了其他远程开发方案:
-
Remote - SSH:官方扩展,提供完整的远程开发体验
- 优点:功能全面,支持终端、调试等
- 缺点:需要服务器安装VS Code Server
-
Remote - WSL:直接在WSL中开发
- 优点:无缝集成,性能好
- 缺点:仅限于本地WSL环境
-
SFTP插件:本文介绍的方法
- 优点:配置简单,适合文件同步
- 缺点:功能相对有限
根据实际需求选择合适的工具组合,我个人在开发中通常会同时使用Remote - SSH和SFTP插件,前者用于编码和调试,后者用于快速文件同步。