本机Win10,使用Pycharm,之前操作服务器一直使用远程进去用ubantu图形界面的Pycharm,或者用远程工具登录,直接vim来搞一点简单的任务,使用FTP或scp来传递文件,其实也挺好用的,但是因为懒得点几下鼠标进远程,懒得记vim的功能,懒得写scp命令,所以还是想搞一些更适合我的工具,打算把VS Code的远程和Pycharm的远程都弄好,到时候想用哪个用哪个,先记录一下VS Code远程的过程。
介绍
remote-ssh,很显然这是基于SSH (Secure Shell) 的远程连接工具,SSH是一种网络协议,对网络技术有所了解的话,应该对网络协议很熟悉了,下面来大概复习一下,OSI的7层网络结构,每一层都有很多种网络协议,比如我们最常见的链路层的L2TP(经常用来做VPN),网络层的IPv4、IPv6,传输层的TCP、UDP等,SSH是会话层的协议,跟FTP、HTTP、Telnet等是一层的,用来控制、建立、断开一段会话,SSH是一种加密的安全的网络服务。
SSH有两种加密级别:
- 基于口令的安全验证:要账号密码,还是很麻烦;
- 基于密匙的安全验证:要生成一对秘钥,一边一个配对,更安全,且不用输入账号密码,棒。
所以目标就是使用remote-ssh插件实现不用输入账号密码的远程连接。
操作
1、Win10 操作
要使用SSH远程,那么,首先,win10、ubuntu上要全部都安装ssh,我们选择OpenSSH,这是SSH协议的一种免费开源的实现。
windows 10系统中下载安装 OpenSSH,很方便,win10自带,如下图,在控制面板——应用与功能——可选功能中:
如果当前可选功能中没有OpenSSH客户端和服务器的话,点击上面的添加功能可以搜索安装,很方便。
安装完成以后,右键我的电脑——管理——服务,右键启动,如果启动是灰的无法点击,就右键属性,选启动类型为手动,然后再启动:
在C:\Windows\System32\OpenSSH中可以查看所有安装了的SSH程序,可以发现scp、sftp都在里面,棒棒的:
现在win10已经安装并启动了OpenSSH,为了做到不用输入账号密码,我们需要生成一对秘钥,一会拿出其中一个给ubantu用:
打开win10自带的PowerShell,输入ssh-keygen,回车三下(使用默认的路径、passphrase),就生成了密钥,找不到自带的powershell可以cmd一下输入powershell:
进入C:\Users\Administrator\.ssh会看到如下图所示的文件,id_rsa.pub就是生成的秘钥中的公钥,一会给ubantu用。
文件夹中可能没有config,我这里有是因为我其实先在VS Code上做了一些操作了,相当于自己提前建立了一个,如果没有config自己建立一个就行,内容如下图,HostName和User对应要连接的服务器IP和用户名,Host 随便起,如下:
其标准为:
Host Ubuntu
# 这里填入远程主机 IP
HostName 192.168.x.xxx
# 这里填入远程主机 ssh 端口
Port 22
# 这里填入要在远程主机上登录的用户名
User ***
# 这里填你私钥的路径
IdentityFile c:\Users\brownfeng\.ssh\id_rsa
# 当需要跳板机的时候就要填这个了
# 这里代理类型根据需求填 socks4、socks5 或 http
# 这里 xxx.xxx.xxx.xxx:xxx 表示跳板机 IP:端口
# 这里 %h %p 无需修改,将自动分别读取 HostName 和 Port 的配置并填入
#ProxyCommand C:\bin\nmap-7.70\ncat.exe --proxy-type http #--proxy xxx.xxx.xxx.xxx:xxx %h %p
到这里windows上就基本操作完了,下面来操作ubantu。
2、ubantu操作
首先查看Linux是否安装ssh服务:
查看ssh是否安装成功 :ps -ef | grep ssh
开启sshd服务 :service sshd start
开启sshd服务 :/bin/systemctl start sshd.service
查看sshd服务的网络连接情况:netstat -ntlp
如下图表示ssh已经在运行:
现在我们需要将公钥id_rsa.pub复制到服务器.ssh/authorized_keys文件中,执行 cd ~/.ssh进入.ssh文件夹,如果发现.ssh目录找不到,不要慌张。
[root@server ~]# cd ~/.ssh
-bash: cd: /root/.ssh: No such file or directory
.ssh 是记录密码信息的文件夹,如果没有登录过root的话,就没有 .ssh 文件夹,因此登录 localhost ,并输入密码就会生成了。
第一次登录对方主机,系统会出现下面的提示:
$ ssh user@host
The authenticity of host 'host' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
翻译:无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
所谓"公钥指纹",是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。
很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
假定经过风险衡量以后,用户决定接受这个远程主机的公钥。
Are you sure you want to continue connecting (yes/no)? yes
系统会出现一句提示,表示host主机已经得到认可,输入密码即可。
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
如果密码正确,就可以登录了。
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
发现没有authorized_keys,我们自己创建一个,linux创建文件的方法很多,通过下面的语句把id_rsa.pub复制到ubantu上,作为临时文件:
scp C:\Users\admin\.ssh\id_rsa.pub [email protected]:~/.ssh/tmp.pub
再通过下面的cat语句将其内容复制到authorized_keys文件中:
cat tmp.pub >> authorized_keys
OK了,万事俱备,来登录一下试试,不需要密码:
3、VS Code 操作
安装插件Remote-SSH:
装完后出现了远程控制的按钮:
点进去就是config里配置好的远程的机子,可以配置多个:
点进去就直接远程了,直接用VS Code打开ubantu上的代码,很方便:
不过出了点小状况,运行时候报错:
找不到这个模块,肯定是工作路径的问题,显式的写出来就可以正常运行了:
import sys
sys.path.append(r'/home/ren_wu/PycharmProjects/used_car_est/')
# vs code 中不加这个路径各种import报错,pycharm应该是自动加入工作目录了,不需要写这句
好了,Win10 上使用VS Code的remote-ssh插件远程ubantu就是这样了。
参考文献:
《SSH原理与运用(一):远程登录》 阮一峰