关闭/断开 ssh隧道转发(ssh连接)的几种方式
- 网络环境
- 方法一(通过文件进行通道管理,本质上文件为socket文件)
- 方法二(通过进程找pid杀掉进程)
- 方法三(只在监听端口的服务器上有效,通过网络服务找pid杀掉进程)
由于工作原因,需要通过ssh隧道去实现远程操作或转发命令的效果,但当把隧道转入后台运行后,发现很难再把这个ssh连接找出来,找到大多数方法都是把进程强行匹配 kill 掉。最后看了一下国外的大神,找到一个相对优雅一点办法,分享一下
网络环境
为了让文章更容易看懂,先初定一个网络环境,用法都是一样的,这个也能在很多情况下用,不同网络环境各位自己灵活变化一下就行。
主机A和远端服务器D不能直接通信,可以通过ssh隧道的方法,把远端服务器某服务端口(比如ssh服务端口为22,数据库服务端口3306等)转发映射到转发服务器B上(比如服务器D的22端口转发到服务器B的7000端口上,主机就可以通过连接B的7000端口直接连接到D的22端口上从而实现连接),具体技术请自行搜索ssh隧道,本篇重点不在这里。
重点,ssh连接建立后放在后台运行了,如何关闭?先直接上新办法,后面有旧方法介绍(没有哪个方法比哪个方法优秀,能达到目的就是好办法)
方法一(通过文件进行通道管理,本质上文件为socket文件)
先上大佬的方法,具体命令和解析在后面
简单解析一下:
主要参数:
<-M> master Mode的介绍具体可用man看,我怕对这个理解有误,减少误导
<-S> 指向一个文件< path-to-socket >(这个文件名字路径和命名可以自定义,只要用户有权限就可以在连接时可以自己创建),本质上是socket文件,本意上是给其他进程用到同一个ssh连接时使用,可以使用这个对断开进行控制。
次要:不同网络环境按需添加
<-L> or <-R> L和R分对应正向代理和反向代理。在上方网络环境中:
通过服务器B配置转发为正向代理,用户名和用户IP指向服务器C,服务器C需开启sshd服务。
通过服务器C配置转发为反向代理,用户名和用户IP指向服务器B,服务器B需开启sshd服务,并配置参数GatewayPorts yes已监听所有IP(不配置好像只能监听127.0.0.1)。
<-C> 压缩传输
<-f> 该ssh连接后台运行
<-N> 静默连接
<-g> 允许远程主机连接用于转发的端口
ssh -CfNg -M -S <path-to-socket> -R <监听IP(服务器B)>:<监听端口号(B)>:<最终目标IP(D)>:<最终目标端口号(D)> (另一个转发服务器)用户名@(另一个转发服务器)IP
以这种方式连接后就可以通过指定的socket文件进行断开该ssh连接:
ssh -S <path-to-socket> -O exit (转发服务器)IP
方法二(通过进程找pid杀掉进程)
这个方法最好保留创建ssh连接命令,也可以通过其他字段查找
ps -aux | grep -v "grep" | grep "<创建ssh连接的命令>" | kill `awk '{print $2}'`
举例如下:
方法三(只在监听端口的服务器上有效,通过网络服务找pid杀掉进程)
正向代理:
netstat -anp | grep 222.111.112.2:22 | awk '{print substr($7,0,length($7)-4)}' | kill `awk '{print}'`
举例如下:(可以精准找出pid)
反向代理:
netstat -anp | grep <:端口号> | awk '{print substr($7,0,length($7)-6)}' | kill `awk '{print}'`
举例如下: