我正在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将保持连接运行,而不需要执行任何命令,你不需要睡眠命令。
此外,您应该设置ClientAliveInterval和ServerAliveInterval解释在这个答案 。
使用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在每个服务器的文件,它会看起来像这样
Host myapp.cloudapp.net User myuser LocalForward 127.0.0.1:39000 localhost:8080 ServerAliveInterval 5
autossh -M 12345 -N -F $HOME/.ssh/config_myapp.cloudapp.net 192.168.10.2