ssh可以说是Linux中使用度非常高的一个命令了,最近使用的时候发现了一些很有趣的东西,故分享出来
断开连接
在我们使用ssh的时候,总会遇到一个问题,ssh连接超时了,但却没有直接断开,而是完全卡住,这个时候无论是Ctrl + C
,Ctrl + 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 )
0 条评论