ssh可以说是Linux中使用度非常高的一个命令了,最近使用的时候发现了一些很有趣的东西,故分享出来

断开连接

在我们使用ssh的时候,总会遇到一个问题,ssh连接超时了,但却没有直接断开,而是完全卡住,这个时候无论是Ctrl + CCtrl + Z 还是 Ctrl + D 都无法断开连接,当然我们可以用其他的方法来强行结束掉这个进程,但有没有优雅一点的方式呢?有的。

只要依次按下 Enter↵ . 即可断开连接
黑人问号

为什么会这样呢,这是ssh的Escape Char的功能。我们看一看ssh的man page,可以看到在参数列表中有一个

-e escape_char

即用-e这个参数设置一个escape char,默认是~

接着往下翻我们能看到更多的Escape Char的使用。

首先Escape Char一定要出现在行首才可以,这也是为什么要先Enter↵的原因。

其次除了~.退出以外,还有一些可以玩的

~^Z: 将ssh进程丢到后台
~# : 列出跳转的连接
~? : 列出所有可用的Escape Char
~C : 打开ssh交互式命令行(这又是什么东西),在其中可以使用-L,-R,-D来转发端口,也可用-KL,-KR,-KD来取消转发,如果你想要运行本地机上的命令,可以使用!command,但这需要你在ssh_config中开启PermitLocalCommand选项
~~ : ~后面可以跟多个~,决定了这是在第几层ssh连接中进行的操作(ssh 链式连接中)

保持连接

前面说了一种在连接冻结的时候主动断开连接的方式,但有没有什么方法可以让连接不冻结呢? 有的。

打开/etc/ssh/sshd_config,找到以下两个选项

ClientAliveInterval 60
ClientAliveCountMax 3
# 一般是被注释了的,如果没有可以自行加上

这两个参数决定了什么时候会被断开连接,像上面参数所设置的,如果60s无响应则会记一次超时,记满3次则断开连接,所以修改这两个参数的值,可以减少连接被冻结的概率(还有一部分原因是网络断了)

转发

ssh 的端口转发也是很常用的功能,可以正向代理,反向代理,也可以动态代理(别想用这个翻墙,可能没一会就给你掐了),但ssh的转发功能并不局限于端口转发

socket 转发

ssh -L /path/to/xxx.sock:/path/to/xxx.sock user@host

这样即可转发socket。但这有什么用呢?我个人觉得最大的用处应该是转发docker.sock,可以偷懒不去配置daemon的http支持(而且通过http并没有ssh安全),就可以在本地轻松的管理远程的docker

x11 转发

在服务器端的sshd_config中开启

AllowTcpForwarding yes
X11Forwarding yes

在本地的ssh_config中开启

ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes

在命令中执行xhost +,允许远程连接,即可开始转发X11

ssh -X user@host

此时执行一个GUI应用,应用界面就会被转发本地机上

(其实我觉得这是一个很鸡肋的功能,因为我们很少会在服务器上用GUI程序)

转发vnc

不过ssh和GUI转发,还有一个很有用处的功能,即用来配合转发x11vnc转发物理端口。

你可能要问,为什么要用ssh呢,直接用vnc不就可以了吗? 确实,但是x11vnc是不可以设置密码或者其他验证方式的,如果将其开在公网上,就很危险,所以需要用ssh来转发5900端口(所以这里其实就是ssh 转发TCP端口)

在服务器上执行x11vnc -display :0,将物理端口:0通过vnc转发到5900端口(注意要用通过防火墙阻断5900的对外连接)

ssh -L 5900:localhost:5900 user@host

然后再用vnc viewer去连接localhost:5900,即可连接服务器的物理端口。

这有什么用呢?注意我这里说的是转发物理端口,即转发你显示器所显示的画面,配合zerotier做内网穿透,即可和朋友共享屏幕或者远程协作 (摆脱闭源Team Viewer恶势力 XD )