SSH连接在没有输入和执行任务空闲一段时间后,就会自动断开连接,以节约系统资源和提高安全性。但在做端口映射的时候,就比较麻烦,刚开始连接上,可能服务端就退出了。可以做一些设置,让其能够保持长期连接。当然,如果网络中断了,连接也就断了,需要想别的办法能够自动重新连接。
Ubuntu 系统
A、服务器配置
修改ssh配置文件/etc/ssh/sshd_config,添加或者修改ClientAliveInterval为:
ClientAliveInterval 60
这个参数的是意思是每1分钟,服务器向客户端发一个消息,用于保持连接。
保存后记得重启ssh服务,使用sudo service sshd restart。
B、客户端配置
在ssh客户端配置文件/etc/ssh/ssh_config中添加下面这行:
ServerAliveInterval 60
或者,在linux系统中使用ssh连接远程服务器时,可以使用-o的一个参数ServerAliveInterval来设置防止超时的时间。
比如:ssh -o serveraliveinterval=60 username@host
自动化执行SSH
我们希望建立端口映射的操作能够自动执行。比如:
- 动态端口映射:
- sshpass -p "password" ssh -D 7070 user@serverip
- 然后本机就可以使用端口localhsot:7070的socks5连接,就跟在serverip上操作一样。
- 反向链接(从本地铺一个桥到服务器,然后其它流量可以从桥上过来):
- sshpass -p "password" ssh -R 2222:localhost:22 root@serverip
- 然后其它机器登入root@serverip,就可以使用 ssh -p 2222 user@localhost:22的方式来访问了。
上面的sshpass是用于命令行传入密码的(否则需要交互输入),ubuntu下可以直接 apt-get install sshpass 进行安装。
然后写脚本autossh.sh,内容如下:
#!/bin/bash
while [ '' == '' ]
do
ssh_d_process_num=`ps aux|grep -E 'ssh \-' |grep -v grep |wc -l`
if [ "$ssh_d_process_num" == "0" ]; then
/home/user/sshpass -p "password" ssh -D 7070 user@ServerIP &
fi
sleep 300
done
执行一下这个脚本就可以了。sleep 300代表300秒查看一次,可以根据需要调整。