防止closuresSSH本地端口转发

我正在Azure上运行的Ubuntu虚拟机上运行各种服务,即使端口未公开打开,我也想远程访问一些服务。 为此,我已经设置了一个脚本来使用SSH进行本地端口转发

通常这是通过连接到远程主机,执行sleep 10 ,并在sleep命令完成之前在转发的端口上build立一个连接。 在使用保持连接活动的服务(如远程SMB共享)时,可以很好地工作。

但是,我在访问Web服务时遇到了问题,因为连接在一段时间后closures – 从build立连接10-90秒后。

在closures时重新连接连接,我根据这个SO线程攻击了这个小脚本。

 while true; do { \ while true; do \ echo echo ping; sleep 10; \ done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config \ -o ExitOnForwardFailure=yes sleep 10; echo "$(date) I died"; sleep 1; done 

不幸的是,这个“修复”有些不稳定,连接经常掉线,所以浏览器每隔五次就挂起一次。 它的工作,但远非完美,所以我想要一个更好的方法。 也许可能有某种脚本进行长时间投票或类似的? 任何人已经解决了这个问题?

使用-N命令行标志ssh将保持连接运行,而不需要执行任何命令,你不需要睡眠命令。

此外,您应该设置ClientAliveIntervalServerAliveInterval解释在这个答案 。

使用autossh 。 它作为一个包存在,并将处理所有这些,而无需编写脚本。 还要在sshconfiguration文件中configurationKeepalive和ClientAliveInterval以及ServerAliveInterval。 选项与ssh类似,但它自动处理丢弃的连接。

例如,启动一个反向隧道(并保持运行状态):

 server_behind_fw # autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C 

接着:

 your_public_seerver # ssh -p 1234 localhost 

将ssh你s server_behind_fw。

告诉ssh发送keepalive数据包,而不是使用sleep和ping。 您正在查找的选项是ServerAliveInterval。 这告诉ssh每隔几秒钟发送一些数据,以便服务器(以及任何nat防火墙)知道连接仍然打开,并且会话不会超时。 这应该仍然与一个脚本,如果连接失败,其他原因将自动重新连接。

有一个configuration它的例子: http : //embraceubuntu.com/2006/02/03/keeping-ssh-sessions-alive/

在这里添加我自己的答案,因为没有一个实际上为我的情况提供了确切的解决scheme。 但这基本上是@ sivann的答案修改我的具体情况。 所以,如果有帮助的话,给他一个赞扬吧!

完整的命令行

 # This forwards all requests to my local 39000 port to port 8080 on the server LOCAL_PORT=39000 REMOTE_PORT=8080 SERVER=myapp.cloudapp.net autossh -M20000 -N -L $LOCAL_PORT:$SERVER:$REMOTE_PORT myuser@$SERVER 

迄今为止,这已经certificate摇滚比我上面拼凑的hackey脚本稳定。

使用configuration文件

如果你想保持configuration在每个服务器的文件,它会看起来像这样

$ HOME /的.ssh / config_myapp.cloudapp.net

 Host myapp.cloudapp.net User myuser LocalForward 127.0.0.1:39000 localhost:8080 ServerAliveInterval 5 

命令行使用configuration文件

autossh -M 12345 -N -F $HOME/.ssh/config_myapp.cloudapp.net 192.168.10.2