ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

VSCode Remote-SSH远程开发全攻略:从SSH免密到conda环境配置与调试

VSCode Remote-SSH远程开发全攻略:从SSH免密到conda环境配置与调试 从一次真实的远程调试经历说起。上周我需要在一台Ubuntu 20.04服务器上跑一个数据分析脚本服务器上有GPU、有32个逻辑核心但代码在本地Windows上。以前我的做法是把代码打包传上去、命令行跑完、再把结果和报错日志拉下来反复看。来回折腾几次心态直接崩了。后来换成VSCode远程SSH连接Linux服务器这条链路本地编辑器直接打开服务器上的文件直接在远程环境里跑和调试那种“本地和远端几乎无感切换”的流畅体验真的很值得认真配置一次。这篇文章把我从零开始到稳定调试的完整过程拆开讲透SSH免密登录、VSCode Remote-SSH连接、Conda环境搭建、Python解释器选择、断点调试以及网上很多文章都讲不清楚的各类报错修复方法。全程按照“保姆级”标准来写新手照着做基本能一次走通。1. 为什么选VSCode Remote-SSH本地编辑器、远端执行环境的真实体验1.1 三种常见远程开发方式的对比大多数新手拿到服务器第一反应是用Xshell或PuTTY连上去然后打开vim改代码。我不否认vim作为编辑器很强大但让你在一个几百行、跨多个文件的Python项目里找函数定义、全局重命名变量、同时开几个文件对照着看效率真的提不起来。另一种常见思路是Jupyter Notebook把代码写在网页里运行。对纯数据分析场景来说它很方便但如果项目里有多个模块、有自定义库、有需要断点调试的复杂逻辑Jupyter的交互模式就会变得很别扭。第三类方案就是我这篇文章要详细讲的VSCode Remote-SSH。它的工作原理可以这样理解本地安装VSCode和Remote-SSH扩展后扩展会在服务器上自动部署一个轻量级服务端组件同时把VSCode的界面“渲染”到本地窗口。你在VSCode里打开的文件、终端、Python解释器、调试器全部指向服务器但编辑体验是本地软件的体验。用这种方式写代码有一个很核心的爽点不需要手动同步代码。你在本地改一行保存服务器上那个文件就已经更新了。跑起来用的是服务器上的CPU、内存和GPU本地电脑只需要负责显示界面。1.2 Remote-SSH适合谁不适合谁如果你符合下面任何一条这套方案会很适合你本地是Windows或Mac但代码必须在Linux服务器上运行项目依赖了服务器上的GPU、大数据集或特殊环境本地无法模拟受不了频繁用scp/sftp手动传代码想直接编辑远端文件不过它也有不适合的场景。如果你只是想在服务器上临时看个日志、改个配置文件直接用终端连接操作更快没必要装VSCode远程环境。另外如果你的网络环境很不稳定SSH经常断可以考虑配置下面的ServerAliveInterval参数允许我后面再讲。1.3 一个重要认知Remote-SSH不是“远程桌面”这里先打一个预防针Remote-SSH不是远程桌面也不是你在本地看到服务器完整桌面的那种方案。它更像是“本地编辑器连接远端开发环境”。你可能会在首次连接时看到进度条卡住或者发现某些VSCode扩展没有生效这些大多不是软件坏了而是没有理解VSCode的“扩展运行位置”机制。这个坑非常典型后面排查章节我会单独说。2. 连接Linux服务器第一关SSH免密登录与连接配置细节2.1 开始前必须确认的三件事在打开VSCode之前先把下面三件事确认好真的能省掉后面一大半报错。第一确认本地已经安装了OpenSSH客户端。Windows 10/11系统通常自带。这一点可以通过在PowerShell或CMD里执行以下命令验证ssh -V如果提示命令不存在需要去系统设置的可选功能里安装OpenSSH客户端。第二确认服务器端的SSH服务是启动的并且22端口可访问。很多发行版默认装好了OpenSSH Server但没有启动。可以在服务器上执行systemctl status sshd如果没有启动执行sudo systemctl start sshd sudo systemctl enable sshd第三确认你清楚服务器的IP地址和登录用户名。这个看似废话但真的有人把云服务器的公网IP和内网IP搞混导致一直连接失败。2.2 用ssh-keygen生成密钥对并上传公钥SSH登录有两种常见方式密码登录和密钥登录。密码登录简单但每次都要输入而且容易被暴力破解。密钥登录更安全也更省事配置一次之后VSCode和命令行都能直接免密连上。在本地执行以下命令生成密钥对ssh-keygen -t rsa -b 4096执行过程中会提示保存路径和设置passphrase我建议路径保持默认passphrase可以留空也可以设置一个。如果设置了passphrase每次使用密钥时还需要输入它实际体验会打折。我个人的习惯是本地开发机的密钥不设passphrase定期更换就行。生成的密钥对有两个文件~/.ssh/id_rsa是私钥绝对不能离开本机~/.ssh/id_rsa.pub是公钥可以放到服务器上。上传公钥到服务器最简单的方式是ssh-copy-id userserver_ip执行过程中会要求输入一次服务器密码之后公钥就被自动追加到服务器的~/.ssh/authorized_keys文件中。如果你的系统没有ssh-copy-id也可以手动执行cat ~/.ssh/id_rsa.pub | ssh userserver_ip mkdir -p ~/.ssh cat ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys这里有个容易踩的坑服务器上的.ssh目录和authorized_keys文件权限不对SSH服务会拒绝使用公钥登录。目录权限建议是700文件权限是600。2.3 一个常见问题ubuntu ssh无法连接很多Ubuntu服务器会遇到“SSH无法连接”的报错原因五花八门但排查顺序很有讲究。我建议按这个顺序来ping server_ip先确认网络通不通telnet server_ip 22或nc -vz server_ip 22确认端口通不通检查服务器sshd服务是否在运行检查服务器防火墙是否放行了22端口Ubuntu自带的防火墙是UFW查看状态sudo ufw status如果状态是active且没有放行22端口执行sudo ufw allow 22还要检查云服务器的安全组规则。这个特别容易被忽略因为是云平台层面的限制你在服务器内部怎么看都正常但外面就是进不去。所有云厂商的管理控制台都有安全组入口确认方向是“入方向”、协议是“TCP”、端口是“22”且有允许规则。2.4 用config文件简化连接配置服务器多了之后每次在VSCode或命令行里输入ssh userip会很低效。我的做法是在本地~/.ssh/config文件里配置主机别名。Host my_server HostName 192.168.1.100 User ubuntu Port 22 IdentityFile ~/.ssh/id_rsa配置之后连接命令简化为ssh my_serverVSCode Remote-SSH连接时也能直接选择这个别名。建议加上两个参数ServerAliveInterval 60和ServerAliveCountMax 3每60秒发送一次心跳包避免网络空闲时连接被断开。3. VSCode Remote-SSH连接与高频报错排查手册3.1 安装Remote-SSH扩展并完成首次连接打开VSCode进入扩展商店搜索“Remote - SSH”认准Microsoft官方发布的那一个点击Install。安装完成后侧边栏会出现远程资源管理器图标。点击打开选择“SSH Targets”再选择“Connect to Host”。如果你之前配置好了~/.ssh/config这里可以直接看到my_server这个别名点击就能发起连接。首次连接时VSCode会在服务器上部署vscode-server组件。这时窗口底部可能显示“Setting up SSH Host”或者“Installing extensions”这个过程需要耐心等待。很多人第一次用的时候看到进度条转很久以为卡死了其实它是在服务器上下载并解压VSCode Server。如果进度条长时间没反应、最后报“Failed to connect to the remote extension host server”大概率是vscode-server下载失败或损坏。解决方案是手动登录服务器把~/.vscode-server目录删掉重来rm -rf ~/.vscode-server然后回到VSCode重新连接让它重新部署。如果网络环境下载很慢可以提前在服务器上把对应的vscode-server压包下载好解压到对应目录但一般不建议第一次就把事情搞这么复杂先试删除重连通常能解决大部分问题。3.2 “此扩展在此工作区中被禁用”报错扩展运行位置机制这个报错我见太多人问过了原文一般是此扩展在此工作区中被禁用因为其被定义为在远程扩展主机中运行。请在 ssh: my_server 中启用。很多人看到之后一脸懵。其实这里的核心是VSCode的扩展运行位置机制。VSCode扩展按用途分两类一类在本地UI上运行比如主题、图标、代码格式化另一类需要在远程主机上运行比如Python扩展、Pylance语言服务器、调试器。当你通过Remote-SSH连接远程主机后工作区就变成了远程工作区。像Python扩展这种需要在远程环境中分析代码、读取解释器信息的扩展自然要在远程环境中运行。此时如果你在本地安装了它VSCode会提示它在本地被禁用因为它的“运行位置”被定义为远程主机。处理方法很简单看到这个提示后点击“在远程扩展主机中启用”或者在扩展面板里找到这个扩展点击“在SSH: my_server中安装”。安装完后重启VSCode窗口扩展就会在远程环境中正常工作。这个机制也解释了另一个常见疑惑为什么有些扩展在远程连接后“消失”了因为它们需要在远程重新安装。VSCode会默认把一部分扩展自动安装到远程但不是全部。3.3 SSH会话断开后命令还会继续跑吗很多人在服务器上跑耗时任务时会遇到一个问题执行python train.py之后不小心把终端关了或者本地电脑休眠了再连上去发现任务没了。要理解这个现象得先知道普通SSH会话的工作方式。你通过SSH登录服务器后启动的进程实际上是当前SSH会话的子进程。主会话断开时挂在这个会话下的子进程会收到SIGHUP信号默认行为就是终止进程。解决办法有三种使用nohup让进程忽略挂断信号nohup python train.py train.log 21 使用tmux或screen保持会话。tmux的好处是会话独立于SSH连接你断开再登录tmux会话还在tmux new -s train python train.py # 按 CtrlB 再按 D 脱离会话 tmux attach -t train # 重新进入会话在VSCode的集成终端里运行任务后即使本地断网只要服务器上进程不是SSH会话的子进程就不会中断。但VSCode终端默认也是SSH会话所以方法还是一样的。我个人推荐tmux因为它的灵活性和对多窗口的支持远超其他方案跑深度学习训练、爬虫、数据处理任务都很顺手。3.4 ubuntu ssh无法连接的其他隐蔽原因有一种情况比较隐蔽服务器上SSH服务的AllowUsers配置限制了登录用户。在/etc/ssh/sshd_config里如果写了AllowUsers xiaoming那其他用户即使密码正确也连不上。排查时看一下这个配置项。还有一种情况是磁盘满了。SSH登录一般需要写日志文件如果/var/log所在分区满了登录时可能报错或异常卡顿。可以用df -h检查磁盘空间。4. 服务器端Conda环境搭建安装、初始化到换源全流程4.1 下载并安装Miniconda服务器上的Python环境管理我推荐用Miniconda而不是Anaconda。Miniconda体积小、启动快只带最基本的包管理器和Python运行环境其他包按需安装。登录服务器后在用户目录下执行wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程中会询问安装路径建议保持默认的~/miniconda3。最后会问是否运行conda init我建议选择yes。这样安装完conda会自动写入shell初始化配置。验证安装conda --version如果提示找不到命令可能是当前shell没有重新加载配置文件执行source ~/.bashrc4.2 最常见的报错conda error: run conda init before conda activate我见过非常多人在这一步被卡住。明明conda安装成功了但一执行conda activate就报错CommandNotFoundError: Your shell has not been properly configured to use conda activate. To initialize your shell, runconda init或者更简短conda error: run conda init before conda activate这个报错的本质是conda activate是一个shell函数不是可执行文件。安装conda之后需要把初始化代码写入shell的配置文件比如~/.bashrc否则shell不认识这个函数。修复方法有两种。第一种直接执行初始化命令~/miniconda3/bin/conda init bash source ~/.bashrc第二种如果conda init执行后仍然不生效可能是因为你用的shell不是bash。先看当前shellecho $SHELL如果是zsh就要执行conda init zsh source ~/.zshrc还有一种手动的方式在~/.bashrc末尾加入source ~/miniconda3/etc/profile.d/conda.sh加完之后source ~/.bashrc即可生效。这种方式在conda init失效时非常管用本质上是手动加载conda的shell函数定义。4.3 conda换源与pip换源加速服务器在国内或者网络环境访问官方源很慢时创建环境会卡在“Solving environment”很久。这一步强烈建议先换源。先看当前源配置conda config --show channels换成清华镜像源conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yespip也要顺手换一下源创建虚拟环境后执行pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple换源之后下载速度通常翻几倍。如果你所在的组织有内网镜像优先用内网的速度更快。4.4 创建独立的Python虚拟环境conda最让我喜欢的一点是不同项目可以建立完全隔离的环境互不影响。我现在每接一个项目都会新建一个虚拟环境然后在里面装依赖。创建一个Python 3.9环境conda create -n py39 python3.9 -y激活环境conda activate py39验证当前Python路径which python这一步非常重要。如果你发现which python显示的路径不在py39环境里说明你的环境没有真正激活。后面配置VSCode解释器时这个路径直接决定了调试器用的是哪一套依赖。常用的conda命令整理如下conda env list # 查看所有环境 conda create -n name python3.x # 创建环境 conda activate name # 激活环境 conda deactivate # 退出环境 conda remove -n name --all # 删除环境 conda list # 查看环境内已安装的包4.5 conda创建新环境时常见的两个小坑第一个坑是创建环境时网络中断。conda在下载包的过程中如果断网有可能留下半成品环境。解决方法是把环境删掉重新创建。第二个坑是镜像源配置了多个channel但有些channel并不存在导致创建环境的时侯一直报HTTP 404。解决方法是先用conda config --remove-key channels清空配置再用上面的命令重新添加有效源。5. VSCode远程Python调试解释器选择与launch.json配置实战5.1 在VSCode中选择远端Python解释器远程连接成功、conda环境也准备好了接下来的核心操作就是让VSCode使用你指定的Python解释器。在VSCode里按CtrlShiftP打开命令面板输入“Python: Select Interpreter”然后选择“Enter interpreter path”再选择“Find...”。这时VSCode会列出远程服务器上的可解释器包括conda环境里的Python路径。我的服务器上装好Minconda并创建了py39环境后解释器路径一般是/home/ubuntu/miniconda3/envs/py39/bin/python注意这里路径里的用户名换成你自己的用户名就行。如果解释器列表里没有自动出现conda环境可以先在命令面板里执行“Python: Refresh”刷新一下或者直接在“Enter interpreter path”里手动粘贴路径。选对解释器之后VSCode左下角的状态栏会显示当前Python环境。如果你看到的是“Python 3.9.13 (py39)”这样的提示说明已经正确选中了conda环境。5.2 配置launch.json实现断点调试VSCode的调试功能依赖调试配置文件。在VSCode里打开一个Python文件点击左侧调试图标然后点击“create a launch.json file”选择“Python Debugger”之后会生成一个配置文件。我建议在launch.json里做如下配置{ version: 0.2.0, configurations: [ { name: Python: 当前文件调试, type: debugpy, request: launch, program: ${file}, console: integratedTerminal, env: { PYTHONPATH: ${workspaceFolder} }, python: /home/ubuntu/miniconda3/envs/py39/bin/python } ] }几个配置项要解释一下program${file}代表当前打开的文件适合调试单个脚本。如果需要调试固定入口比如主程序是main.py可以改成${workspaceFolder}/main.py。consoleintegratedTerminal表示调试时的输入输出走VSCode集成终端这样input()函数可以正常交互。python显式指定解释器路径。虽然前面已经选择了解释器但launch.json里再指定一次更稳妥避免VSCode在某些情况下使用默认解释器。配置好之后在代码行号左侧点击就能打上断点然后按F5开始调试。调试过程中可以查看变量值、调用堆栈体验和本地调试几乎一样。5.3 调试过程中容易踩的坑第一个坑调试器启动时提示“The Python path in your debug configuration is invalid”。这个报错说明launch.json里指定的python路径不存在。检查一下conda环境的实际路径用which python确认再把正确的路径填入。第二个坑断点不生效、代码一次跑到底。这种情况绝大多数是解释器没选对比如你选的是系统自带的/usr/bin/python3而代码运行的环境是conda的py39那么断点自然不会被命中。还有一种可能是代码被缓存了在调试器里点击“Restart”重试。第三个坑远程调试时工作目录不对。有时候你在服务器上一个子目录里打开VSCode但${workspaceFolder}指向的路径与你预期不一致导致相对路径的文件读写失败。可以在launch.json里用cwd: ${workspaceFolder}显式指定工作目录。第三个坑其实很隐蔽。VSCode远程连接后你打开的文件夹就是服务器上的一个路径。如果你通过CtrlO打开了一个目录那${workspaceFolder}就是它。如果直接用SSH终端打开文件VSCode可能没有正确设置工作区。所以一定要用“File - Open Folder”的方式来打开远程目录。6. 远程开发日常高频问题与效率提升技巧6.1 Linux解压Windows压缩包文件名乱码这个问题太常见了。你在Windows上把一个项目打包成zip传到Linux服务器上用unzip解压结果所有中文文件名全变成乱码。原因是Windows的zip默认用GBK编码保存文件名而Linux的unzip按UTF-8解码。解决办法是让unzip强制用GBK解压文件名unzip -O CP936 project.zip如果你的unzip版本不支持-O参数可以用Python脚本处理python -c import zipfile; zipfile.ZipFile(project.zip).extractall()还有一种方式是用7z7z x project.zip7z对中文编码的处理更宽容很多场景下能直接解出正确的文件名。6.2 SSH密钥失效与权限问题还有一次我遇到一个奇怪的现象公钥明明已经配置好了但连接时还是要求输入密码。排查之后发现是服务器上/home/user目录权限变成了755导致OpenSSH拒绝使用authorized_keys。修复方法chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 755 ~保持这个习惯之后绝大多数公钥登录失效的问题都能提前避免。6.3 设置VSCode中文界面与常用配置如果你觉得VSCode菜单是英文不舒服安装“Chinese (Simplified) Language Pack”扩展重启后即变为中文界面。这个扩展是纯粹的UI翻译不影响代码功能和调试行为。我个人的另外几个远程开发配置建议在VSCode设置里搜索“files.autoSave”建议设置为“afterDelay”这样本地编辑后自动保存服务器文件随时保持最新。搜索“remote.SSH.defaultExtensions”可以配置一批每次连接远程时自动安装的扩展比如Python、Pylance、Jupyter等。再设置一下终端字体和行高远程终端显示长时间运行的日志时会更舒服。terminal.integrated.fontSize: 14, terminal.integrated.lineHeight: 1.2,6.4 在服务器上运行长时间任务的组合拳当你需要训练一个模型或者跑一批数据跑一两个小时是常态。我现在的标准操作是登录服务器开tmux会话在会话里激活conda环境执行训练脚本然后脱离会话。这样即使SSH连接断开任务依然执行。想查看进度时重新登录tmux attach -t train一切还在。配合日志输出到文件nohup python train.py train.log 21 tail -f train.log这种组合方式已经成为我远程开发最稳定的工作流基本没有再遇到过任务中途消失的情况。再说回VSCode Remote-SSH。很多新手会担心这套配置是不是很难维护。根据我这几年的实际体验其实只要把最前面几步走顺了后面就是普通的使用过程。SSH密钥、conda环境、解释器路径这三样东西就像是你远程开发的三把钥匙备齐了剩下的就是日常开发了。尤其是conda环境每换一个项目就新建一个环境装包、换版本都不会污染服务器上的系统Python也不会影响其他项目真的很省心。最后分享一个小技巧。如果你经常在多个服务器之间切换VSCode左侧的远程资源管理器里可以把所有SSH Target按目录分组管理类似“工作项目”和“个人实验”两组这样连接时一目了然。顺便提醒一个细节新装的vscode-server组件占用的空间不小如果服务器磁盘吃紧定期清理~/.vscode-server里的旧版本目录能腾出不少空间。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表