vscode+ssh+cpolar=优雅的远程coding

写在前面
之前用的都是可视化的远程控制软件(向某葵等)来实现远控,这个最大的优点就是可操作空间很大,但是存在下面几个问题:
1、针对主要业务是编程的用户来说,图形界面的传输无疑是浪费了大量的带宽的,所以一旦你的网速或者服务器的网速不够快,你实际coding的效率就会大打折扣了;
2、无法实现被控端与控制端的共同操作,A想用到B的服务器的资源,但是如果B也正在coding,B必须暂停给A用;
3、A机子想要把刚复制的文本传给B(比如说想要将A查到某篇博客的代码段复制到实际的运行环境B上运行的时候,就需要通过间接的方式发送过去,降低开发效率);
4、以后的的工作场景下远程服务器也是没有图形界面的;
综上所述,利用ssh来实现remote coding才是专业coder的康庄大道。这篇文章记录一下初次使用ssh的过程中遇到的各种问题,也为了方便以后换了服务器能快速根据这个笔记搭建起来。

一、工具简介

  1. ssh
    SSH 叫安全外壳协议(Secure Shell),是一种加密的网络传输协议,可在不安全的网络中网络服务提供安全的传输环境。它通过在网络中创建安全隧道来实现 SSH 客户端和服务器之间的连接。详细理解可以参考这篇文章 - 深入了解SSH
  2. vscode
    万能编辑器。通过配置插件可以让他成为你的链接服务器之后的显示终端,实现"本地coding"的效果。
  3. cpolar
    实现内网穿透的工具,学生党首选。不仅有ssh的tcp通道,还有http/https通道,可以用于自己搭一个微型服务器。详细介绍也可以看这篇文章 - 学生一般使用的内网穿透工具有哪些

二、配置流程

总体需求:A要通过ssh链接到B,然后直接在A的界面直接对B进行没有图形界面的终端操作。

1. vscode插件配置

1.1 下载插件

在这里插入图片描述
在这里插入图片描述

1.2 写配置文件

在这里插入图片描述
按照下面这个格式来配置服务器信息。

Host xxx
    HostName ip
    Port 端口
    User 服务器的用户名
    IdentityFile "C:\Users\xxx\.ssh\id_rsa" # 存储的认证密钥,后面会讲

然后把config这个文件路径填进插件的配置路径里。
在这里插入图片描述

1.3 配置问题

2. ssh服务配置

接下来以客户端A远程控制服务器B为例,讲解个操作系统下的配置过程。A和B都各子可以是任意的操作系统,大家只需要根据自己的客户端和服务器各自是什么os对号入座在下面找到对应的安装和配置方法即可。

2.1 window10

2.1.1 安装方法

window下,openssh分为客户端(client)和服务端(server)。可以先通过下面两种方式查看这两个服务是否已安装:

  • 命令方法
    Get-WindowsCapability -Online | Where-Object Name -like 	'OpenSSH*'
    
    在这里插入图片描述
    Notpresent表示还没安装,Installed则已安装。
  • 可视化点击
    ctrl + s 搜索“应用和功能” -> “可选功能”->搜索“ssh”,如果出现下面结果则显示已安装。
    在这里插入图片描述
    若没有安装,则点击“添加功能”,然后搜索“OpenSSH 服务器”安装即可。
2.1.2 客户端配置

client的作用顾名思义就是给本机一个接口去用ssh链接其他服务器,并且把这个ssh路径配置到系统环境变量path中,window系统一般都配置好的。但是这里有个小坑就是如果你的window同时有了git的ssh和openssh,这样会有冲突,可以选择把自带的openssh中的环境变量删掉,把git的ssh目录添加进去,如下图所示。
在这里插入图片描述

2.1.3 服务器配置

server的作用顾名思义就是本机要作为服务器给其他主机控制时,本机上就要运行openssh-server。 server则需要自己下载,可以通过微软提供的在线下载方式:设置界面或者powershell下载。但是如果报下面这个错误的话:
在这里插入图片描述
可以直接采用离线下载即可,参考这篇文章 - openssh离线下载 。server下载完之后,就要对openssh进行一些配置,window下的命令总结如下:
shell sc config sshd start= auto # 设置成开机自启动,装完openssh之后最 好立刻运行这条命令 net start sshd # 启动命令 net stop sshd # 关闭命令
配置完、启动server之后,还需要将本机的ssh的端口(常用就是22)暴露出去。具体操作就是:“控制面板”->“系统和安全”->“防火墙”->左侧栏上的"高级设置"->"入栈规则"右键”新建规则“,接下来看下图
在这里插入图片描述
在这里插入图片描述
接下来两步都是直接下一步即可。到此,其配备了ssh的机子就可以通过ssh来远程本台服务器了。

2.1.4 配置问题
(a) login permission denied

通过ssh连接windows服务器,报错"permission denied, try again",有两个方法:

  • 检查username、ip、password;
  • windows服务器必须要设置密码,不能无密码登录ssh。

2.2 ubuntu

2.2.1 安装方法

同样,ubuntu下ssh也分为客户端(sshd)和服务端(sshd-agent)。输入下面命令,即可查看这个端的安装情况。

ps -e |grep ssh

在这里插入图片描述
如果哪个没有,直接按照下面的命令直接下载即可。

sudo apt-get install sshd
sudo apt-get install openssh-server
2.2.2 客户端和服务器配置

linux配置客户端和服务器都是同时启动和关闭的,因此只需要配置一次即可。

sudo systemctl enable ssh # 开机自动启动ssh命令
sudo systemctl disable ssh # 关闭ssh开机自动启动命令
sudo systemctl start ssh # 单次开启ssh
sudo systemctl stop ssh # 单次关闭ssh
reboot # 设置好后重启系统(不一定要操作)
sudo systemctl status ssh #查看ssh是否启动,看到Active: active (running)即表示成功
2.2.3 配置问题

2.3 mac

本人还没配置过mac的ssh,先占个坑位,以后用到再来填!

3. 免密认证

经过【1】之后,我们连接SSH是需要通过密码进行连接的,这会非常麻烦,每次连接都要重新输入密码,接下来就讲解各操作系统下的服务器的免密认证怎么操作。

3.1 window10

window的配置参考这篇博客,讲的非常好:Windows OpenSSH 服务器启用密钥登录

3.2 ubuntu

ubuntu的配置非常简单,参考这篇博客即可: vscode连接服务器不用每次都输入密码

3.3 mac

4. cpolar实现内网穿透

在【0】、【1】、【2】操作之后,我们已经可以实现了局域网内的ssh连接了。但是生产工作环境中,更多的应用场景是A跟B并不会在同一个局域网内的。现在要解决的就是A和B不在同一个局域网内,如何实现A仍能通过ssh控制B。cpolar应运而生!
总的来说cpolar就是先在B上运行起一个服务,建立一个隧道,A访问cpolar提供的域名,就会通过这个隧道访问到B,而A只需要将我们之前在vscode上填的ip换为coplar提供的域名即可。 接下来介绍一下在各个os下的B运行起cpolar的操作步骤。cpolar的官网链接

4.1 window10

4.1.1 配置流程
  1. 进入官网下载cpolar;
    在这里插入图片描述
  2. 一路安装即可,输入以下命令检查是否安装成功;
    cpolar version # 查看版本号
    cpolar authtoken xxxxxxx # token认证,登录cpolar官网,然后在“验证”那一块有
    cpolar http 8080 # 挂http服务
    
  3. 进入localhost:9200创建ssh通道;
    在这里插入图片描述
  4. 配置开机自启动:ctrl + s 搜索“服务”设置cpolar service自启动即可。
    在这里插入图片描述
4.1.2 配置问题
(a) cpolar卸载重装问题

如果因为重复认证导致授权失败等原因需要重新安装cpolar的时候,需要卸载上一个cpolar,但是不卸载干净就会导致无法重装,所以这里给出一个完全干净的卸载流程:

  1. 删除cpolar所有相关文件,包括删除"C:\User\Username.cpolar"这个文件夹;
  2. ”控制面板“ -> ”程序” -> “卸载程序” -> 找到cpolar并卸载(这一步可能会卸载不了);
  3. win + r 输入Regedit,打开注册表,找到HKEY_CLASSES_ROOT下面的Installer节点,右键点击“查找”,输入“cpolar”。然后就可以定位到一个文件,把含有该文件的文件夹删掉即可。

4.2 ubuntu

4.2.1 配置流程

按照这篇blog来即可 - Ubuntu用户安装Cpolar内网穿透。然后在vscode的ssh配置中把hostname字段的值改成官网里看到的这个字段即可。
在这里插入图片描述

cpolar的常用指令

cpolar version # 查看版本号
cpolar authtoken xxxxxxx # token认证,登录cpolar官网,然后在“验证”那一块有
cpolar http 8080 # 挂http服务
sudo systemctl start cpolar # 启动cpolar服务
sudo systemctl stop cpolar # 停止cpolar服务
sudo systemctl status cpolar # 查看服务状态
sudo systemctl enable cpolar # 开机自启动
4.2.2 配置问题
(a) vscode 链接的时候报错:kex_exchange_identification: read: Software caused connection abort

参考博客

This host key is known by the following other names/addresses

原因:这个问题出现是因为cpolar每次启动之后生成的tcp域名和接口都是不同的,所以直接用旧域名链接的时候,因为访问服务器的客户端都是同一台机子,访问ip是相同的,但是服务端那边的保存的曾经访问过的host name/address没有这个新的,就会报错。
解决方法1: 直接开一个终端来通过访问,然后强行把这个新域名和端口添加进去。
在这里插入图片描述
解决方法2: 氪金升级成专业版,独享固定的tcp域名。具体操作看这篇blog - cpolar如何配置固定TCP地址

配置完之后,cpolar没有显示对应的ssh端口,连接不上默认启动的ssh?

解决方法:先确保服务器的ssh服务端已安装好,如果还不行就把服务器直接重启。

4.3 mac

还没配过,配了再来填坑。

三、实际使用中的技巧和问题

这里记录一下实际使用过程中遇到的问题和很好用的技巧!为了给技巧和问题分类,这里我采用场景来作为分类,比如某一节的标题为“window10=>ubuntu”就代表该节下的所有技巧和问题都是我在这个场景下遇到的。

1. window10 => ubuntu

1.1 利用winscp传输文件

问题
需要在window和linux下互传文件,利用百度网盘等在线网盘速度慢,而且linux下的网盘不稳定,下载大文件时容易中断,而且整个过程耗时长(需要先上传,然后再下载)。
解决
WinSCP 是一个在 Windows 环境下使用 SSH 的开源图形化 SFTP 客户端,同时支持 SCP 协议。它的主要功能是在本地与远程计算机之间安全地复制文件。与使用 FTP 上传代码相比,通过 WinSCP 可以直接使用服务器账户密码访问服务器,无需在服务器端做任何配置。
使用链接:WinSCP使用文档

1.2 利用screen在服务器上创建进程

问题
远程连接服务器在执行训练神经网络等需要长时间运行任务时,一旦因为网络等原因导致了ssh链接中断了,训练就白费了。
解决

利用linux里边的screen程序可以解决,具体的介绍和使用方法可以参考这篇blog - Linux–screen远程必备 #screen常用命令-会话的创建、恢复、删除(&重命名删除)用法

下面我总结出大概的使用流程(以深度学习为例):
① 创建一个screen(yao),之后就会进入这个screen里边;

screen -S yao

② 在这个screen里头运行你的代码(运行test文件);

python test.py

③ 把这个screen detach掉,挂起来运行,回到你的原本界面,这时候你想关掉当前的ssh链接也行了;

screen -d yao # 或者直接快捷键 ctrl a + d

④ 当你觉得跑的差不多了,想看一下跑得咋样,就重新连一下ssh,然后执行下面的命令进入到你之前的那个screen;

screen -r yao # 恢复进入screen

如果你忘记了之前的screen叫啥,可以查看一下列表

screen -ls

或者想让其他人进入你这个screen,也可以

screen -x yao

⑤ 不用了之后删除这个screen。

screen -S yao -X quit

1.3 vscode远程debug,无法跳转函数定义

参考这篇文章 - vscode ssh远程连接服务器 无法跳转函数定义

1.4 硬盘挂载问题

如果服务器的硬盘需要手动挂载,可以在成功通过ssh连接到服务器之后,通过这个方法来实现硬盘的自动挂载-硬盘挂载

1.5 内网conda环境迁移

现有A和B两台处在同一个局域网下的linux服务,B无法通过联网下载conda环境,而A可以连外网,这是通过SCP命令直接将A的环境传输到B中,如下所示:

scp /homeA/anaconda3/envs/xxx username@address:/homeB/anaconda3/envs/xxx

前提是两台服务器的cuda版本要求要相同。但是这样传输完之后,直接调用还是没办法使用对应环境里边的python的,这时需要通过下面代码修改权限就可以了。

chmod +x /home/anaconda3/envs/xxx/bin/python

1.6 vscode反复输入密码,无法链接

打开vscode,点击左上角菜单 -> “View” -> ”Comand Platte" -> 输入“Remote SSH: Kill VS Code Server on Host…” ->选择对应的host进行清空。

1.7 vscode连接过程卡在downloading with wget

用可视化软件控制服务器,人工下载替代wget,详细可参考这篇文章:link

1.8 服务器换源问题

参考:link

1.9 服务器vscode开启debug模式

参考链接:link

1.10 服务器内存、cpu、gpu监控

在conda环境中安装nvitop

pip3 install --upgrade nvitop

接着在该环境中输入

nvitop

2. ubuntu => window10

2.1 利用scp进行文件传输

scp除了可以用来进行linux和linux的文件传输,还可以从linux到window,当然也可以window到linux(互换一下命令种的位置即可)。下面以从linux上转移文件到window为例子进行解释:

 scp -P 6666 /home/xx/demo.txt User@Win_IP:/E:/aaa/bbb

这句命令是将ubuntu上的demo.txt文件拷贝到window的/E:/aaa/bbb目录下。其中,6666是远程服务器(window10)的ssh端口号。记住P是大写的,并且要写在前面。/home/xx/demo.txt是ubuntu上面的路径下的文件。User是远程主机用户名,Win_IP是远程主机IP地址。/E:/aaa/bbb
/home/xx/demo.txt要在远程主机上存放的位置。如果要传输文件夹,用下面命令:

 scp -P 6666 -r /home/xx User@Win_IP:/E:/aaa/bbb

这句命令的作用是将*/home/xx* 传输到*/E:/aaa/bbb* 下,-r是递归传输的意思。如果要给传输进度加上进度条,加上-v即可:

 scp -P 6666 -v /home/xx/demo.txt User@Win_IP:/E:/aaa/bbb

2.2 压缩与解压缩命令

当linux作为主力机的时候,难免会遇到一些压缩和解压的操作,这里记一下,不用每次都去搜。参考:link
tar格式:

# 压缩当前目录下文件夹/文件test到test.tar.gz
tar -zcvf test.tar.gz test
# 解压当前目录下的file.tar.gz到file
tar -zxvf file.tar.gz

zip形式:

# 压缩当前目录下文件夹/文件test到test.zip
zip -r test.zip test
# 解压当前目录下的file.tar.gz到file
unzip test.zip

这里顺便记录一下linux安装.deb包的命令

sudo dpkg -i package_file.deb

2.3 网络代理

外网上网是必不可少的。当linux作为主力机的时候,配置有一点麻烦,这里记一下坑。参考:link
主要就是按照上述教程来操作即可,但是有几点要稍微注意的:

  1. 下图中紫色框框住的部分一定要选Builtin Subscription Support: Basic Based64
    在这里插入图片描述
  2. 下面紫色框框住的部分最好不要勾选,否则可能会出现报错: 端口已被本地进程占用的情况
    在这里插入图片描述

3. ubuntu => ubuntu

3.1 环境迁移后使用包报错

问题如下:
在这里插入图片描述
解决:直接终端打开输入

vim /home/lyh/anaconda3/envs/hsi/bin/tensorboard

然后把路径修改为你自己的就可以了。参考

写在后面
以上都是作者实操踩雷的经验,如果这篇文章给了你一点帮助不妨给个👍,后面更新也更有动力💪。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值