# Vscode远程开发实践
> 前提准备:
>
> 安装Vscode,并熟练使用Vscode;
>
> 拥有一台云服务器(阿里云ECS或轻量级服务器)
>
> 熟练掌握Linux命令
>
> 安装Xshell或者Xftp
>
> 熟练使用git
>
> 详细阅读Vscode文档中关于远程开发的介绍
## Intro
每次使用IDEA进行开发时,本机电脑的CPU和内存经常拉满,性能被严重消耗。因此,选用lVscode进行远程开发,将代码的编译和运行工作量转移远程服务器上,以缓解本地电脑的性能。选用Vscode进行远程开发原因之一是,本地电脑性能不够用时,将代码开发工作转移到服务器。当然,还有一些其他的原因,比如,公司同时几个人开发同一个项目时,也会使用到远程开发。值得一提的是,我最喜欢的J--etbrains家的IDE最近也推出远程开发的功能,还有一款轻量级编辑器Fleet。我在我的其他文章里有介绍jetbrains家的远程开发。
## 环境准备
1. 根据开发项目,在服务器安装好开发环境,如JDK1.8、Python3、Node、Maven、Git、Nginx、Tomcat等。
2. Windos安装有兼容Open SSH的SSH客户端
> [SSH小提示](https://code.visualstudio.com/docs/remote/troubleshooting#_installing-a-supported-ssh-client)
>
> [Windos上安装OpenSSH](https://docs.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_install_firstuse)
### 安装远程开发插件
一般来说,安装核心的Remote-SSH、Remote-WSL、Remote-Containers插件即可。在插件商店输入`Remote`关键词,即可安装。
> 会搜到三个结果
> Remote - SSH - 通过使用 SSH 链接虚拟或者实体Linux主机。
> Remote - Containers – 连接 Docker 开发容器。
> Remote - WSL - 连接 Windows Subsystem for Linux (Linux子系统)。
> 装一个就全装上了,我们其实只需要ssh的这个。
![image-20211220112833538](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201128171.png)
安装成功后,可以看到VScode界面的左下角出现一个新的状态栏项目。
![远程状态栏项目](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201133625.png)
点击`SSH Targrts`
![image-20211220142407781](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201424213.png)
点击配置文件用户下的.ssh目录的config文件
![image-20211220142708607](C:%5CUsers%5CZhouJiankang%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20211220142708607.png)
设置主机名,配置主机地址,主机用户
![image-20211220143029553](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201430266.png)
![image-20211220113714757](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201137498.png)
安装插件后,会显示直接选择连接到哪一个系统?`Linux`、`Windows`、`Macos`,根据远程服务器(虚拟机)的系统进行勾选,输入IP地址,输入密码。这里根据提示一步一步输入即可。但是这样做,每次连接到远程服务器时,都需要输入密码。因此要配置SSH秘钥,简单说就是将本地秘钥添加到服务器。
#### 设置SSH
通常,如果了解过Github或者Gitee中SSH秘钥设置,对此不会陌生。在之前我就设置过SSH秘钥,所以无需再生成。
在用户的.ssh目录下,`id_rsa.pub`文件![image-20211220140547077](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201405316.png)
如果没有,现在就生成一个。在`Git bash`面板中或者 bash shell 或命令行并输入:
```
ssh keygen
```
如不了解秘钥的详细配置生成,一直回车,存储到默认位置即可。
#### 将秘钥添加到远程主机
复制`id_rsa.pub`文件中的内容,粘贴到主机。(手动添加方式,如没有成功,重新更换秘钥或开放22端口)
![image-20211220141803810](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201418592.png)
当然也可以命令复制到远程主机上。
```
# 将10.10.10.10替换成你服务器的IP或者域名
ssh-copy-id -i id_rsa-remote-ssh.pub 10.10.10.10
```
添加成功后,可直接登录。也可以在CMD命令行或Git Bash 或Power Sheel中登录到远程主机。
```
# ssh user@Hostname
ssh root@aliyun-hangzhou-lujie
```
![image-20211220155201027](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201552218.png)
到这里VScode中的远程开发配置就介绍完毕了。对了,忘记提一下,远程开发还有端口转发的功能,以适用于开发Web应用。
### 远程开发实践
尝试一下经典的HelloWolrd。
![image-20211220160835200](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201608839.png)
尝试一下端口转发功能。
![image-20211220161552464](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201615482.png)
![image-20211220175328916](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201753401.png)
## 拓展
配置远程远程开发,意味着需要在远程安装插件,并配置相关的插件。
![image-20211220180607867](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201806657.png)
### SSH介绍
SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。ssh服务端由2部分组成: openssh(提供ssh服务) openssl(提供加密的程序)。ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接。
SSH基于公钥登录的验证流程,如下:
![image-20211220182209411](https://mybolg-typora.oss-cn-beijing.aliyuncs.com/%20blogPic/202112201822244.png)
- 1.Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
- 2.Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R)
,然后将加密后信息发送给Client。
- 3.Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
- 4.Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
- 5.Server端会最后比较Digest1和Digest2是否相同,完成认证过程。
### SSH的加密技术
加密技术:传输过程,数据加密。
1.SSH1没有对客户端的秘钥进行校验,很容易被植入恶意代码
2.SSH2增加了一个确认联机正确性的Diffe_Hellman机制,每次数据的传输,Server都会检查数据来源的正确性,避免黑客入侵。
SSH2支持RSA和DSA密钥
DSA:digital signature Algorithm 数字签名
RSA:既可以数字签名又可以加密
### SSH知识小结
1.SSH是安全的加密协议,用于远程连接Linux服务器
2.SSH的默认端口是22,安全协议版本是SSH2
3.SSH服务器端主要包含2个服务功能SSH连接和SFTP服务器
4.SSH客户端包含ssh连接命令和远程拷贝scp命令等
### 如何防止SSH登录入侵
1.密钥登录,更改端口
2.牤牛阵法
3.监听本地内网IP(ListenAddress 192.168.25.*)
### SSH功能大全
```
1.登录
ssh -p22 omd@192.168.25.137
2.直接执行命令 -->最好全路径
ssh root@192.168.25.137 ls -ltr /backup/data
==>ssh root@192.168.25.137 /bin/ls -ltr /backup/data
3.查看已知主机
cat /root/.ssh/known_hosts
4.ssh远程执行sudo命令
ssh -t omd@192.168.25.137 sudo rsync hosts /etc/
5.scp
1.功能 -->远程文件的安全(加密)拷贝
scp -P22 -r -p /home/omd/h.txt omd@192.168.25.137:/home/omd/
2.scp知识小结
scp是加密远程拷贝,cp为本地拷贝
可以推送过去,也可以拉过来
每次都是全量拷贝(效率不高,适合第一次),增量拷贝用rsync
6.ssh自带的sftp功能
1.Window和Linux的传输工具
wincp filezip
sftp -->基于ssh的安全加密传输
samba
2.sftp客户端连接
sftp -oPort=22 root@192.168.25.137
put /etc/hosts /tmp
get /etc/hosts /home/omd
3.sftp小结:
1.linux下使用命令: sftp -oPort=22 root@x.x.x.x
2.put加客户端本地路径上传
3.get下载服务器端内容到本地
4.远程连接默认连接用户的家目录
```
### ssh常见命令参数
```
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-i identity_file] [-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
```
### 关于后台ssh服务的相关
```
# 查询openssl软件
rpm -qa openssh openssl
# 查询sshd进程
ps -ef | grep ssh
--> /usr/sbin/sshd
# 查看ssh端口
netstat -lntup | grep ssh
ss | grep ssh (效果同上,同下,好用)
netstat -a | grep ssh(记住这个)
netstat -lnt | grep 22 ==> 查看22端口有没有开/ssh服务有没有开启
技巧: netstat -lnt | grep ssh | wc -l -->只要大于2个就是ssh服务就是好的
# 查看ssh的秘钥目录
ll /root/.ssh/known_hosts # 当前用户家目录的.ssh目录下
# ssh的配置文件
cat /etc/ssh/sshd_config
# ssh服务的关闭
service sshd stop
# ssh服务的开启:
service sshd start
# ssh服务的重启
service sshd reload [停止进程后重启] ==> 推荐
service sshd restart [干掉进程后重启] ==> 不推荐
# ssh远程登录
ssh 192.168.1.100 # 默认利用当前宿主用户的用户名登录
ssh omd@192.168.1.100 # 利用远程机的用户登录
ssh omd@192.168.1.100 -o stricthostkeychecking=no # 首次登陆免输yes登录
ssh omd@192.168.1.100 "ls /home/omd" # 当前服务器A远程登录服务器B后执行某个命令
ssh omd@192.168.1.100 -t "sh /home/omd/ftl.sh" # 当前服务器A远程登录服务器B后执行某个脚本
```
### 远程主机谅解不上,SSH排查策略
```
1.判断物理链路是否通 ping 192.168.25.130 线路 | 防火墙 | 是否同一个网的
ping 本身是icmp协议
2.判断服务是否正常
telnet 192.168.25.130 22
3.Linux防火墙
service iptables status ==> /etc/init.d/iptables status
4.打开ssh的调测进行观察
ssh -vvv omd@192.168.1.100
```
### SSH批量分发与管理方案小结
1.利用root做ssh key验证
> 优点:简单,易用
> 缺点:安全性能差,无法禁止root远程连接
2.利用普通用户omd -->推荐
>
> 思路:把要分发的文件拷贝到服务器用户的家目录,然后利用sudo提权拷贝分发的文件和对应目录
> 优点:安全
> 缺点:复杂,配置麻烦
> 1.sudo提权
> echo 'omd All=(All) NOPASSWD:/usr/bin/rsync' >> /etc/sudoers
> visudo -c
> grep omd /etc/sudoers
> 2.ssh分发到服务器的家目录
> ssh -p22 -r /etc/hosts omd@192.168.25.137:~
> 3.ssh使用sudo复制到目标服务器的/etc
> ssh -t omd@192.168.25.137 sudo rsync hosts /etc/
3.拓展方案2,不用sudo,而是设置suid对固定命令提权
> 优点:相当安全
> 缺点:复杂,安全性较差,任何人都可以处理带有suid权限的命令
> 1.which rsync
> 2.chmod 4755 /usr/bin/rsync
## 引用
[ 1 ] [Vscode之远程开发SSH配置](https://code.visualstudio.com/docs/remote/ssh-tutorial)
[ 2 ] [Vscode文档之远程开发的技巧和窍门](https://code.visualstudio.com/docs/remote/troubleshooting#_installing-a-supported-ssh-client)
[ 3 ] [Linux SSH 命令详解](https://www.cnblogs.com/ftl1012/p/ssh.html )
[ 4 ] [阿里云文档之Linux实例如何限制指定用户或IP地址通过SSH登录](https://help.aliyun.com/knowledge_detail/41221.html?spm=5176.21213303.J_6704733920.7.1a9c3edaE4Hm39&scm=20140722.S_help%40%40%E7%9F%A5%E8%AF%86%E7%82%B9%40%4041221._.ID_help%40%40%E7%9F%A5%E8%AF%86%E7%82%B9%40%4041221-RL_ssh%E7%99%BB%E5%BD%95-OR_main-V_2-P0_0)
Vscode远程开发