LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1115|回复: 10

ssh 的断线重试。

[复制链接]
发表于 2005-8-29 21:22:18 | 显示全部楼层 |阅读模式
用一个脚本保证ssh连接到另一台机器,用循环让连接中断退出后重新登录。
但是ssh登上后,如果不发送数据,即使连接已中断,ssh仍然不会察觉而退出,因为必需有一个后台进程每隔几秒向ssh进程的终端发送数据。

这个脚本的用途是把内网的机器通过ssh的端口转发把22号端口转到外网的机器,从而从外网可以ssh到内网的这台机器。

大侠们给个思路。
发表于 2005-8-29 22:37:37 | 显示全部楼层
ssh 的反向转发是很有趣。
外网主机无法直接连接内网的机子,这时候内网机子就可以用ssh建立到外网主机上ssh服务的反向连接,将ssh连接转发到外网的某个本地端口上,这样外网主机就可以通过连接本地端口来变相的连接到内网主机上。
我没有实际使用过,只是从debian的邮件列表上看到过这样的讨论。

我想ssh连接中断可能是跟外网主机的ssh服务配置有关,改一下相应的配置文件是否更方便?

ssh
    -R port:host:hostport
             Specifies that the given port on the remote (server) host is to be forwarded to
             the given host and port on the local side.  This works by allocating a socket
             to listen to port on the remote side, and whenever a connection is made to this
             port, the connection is forwarded over the secure channel, and a connection is
             made to host port hostport from the local machine.  Port forwardings can also
             be specified in the configuration file.  Privileged ports can be forwarded only
             when logging in as root on the remote machine.  IPv6 addresses can be specified
             with an alternative syntax: port/host/hostport.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-29 23:00:20 | 显示全部楼层
连接中断也有可能是网络。而且我的外网机子是拨号。
a.sh:
while(true)
do
    sleep 10
    echo "pwd"
done

b.sh
while(true)
do
    ssh -R10000:localhost:22 myhost_outside
done

运行 a.sh | b.sh
回复 支持 反对

使用道具 举报

发表于 2005-8-30 00:05:08 | 显示全部楼层
Post by acguy
连接中断也有可能是网络。而且我的外网机子是拨号。
a.sh:
while(true)
do
    sleep 10
    echo "pwd"
done

b.sh
while(true)
do
    ssh -R10000:localhost:22 myhost_outside
done

运行 a.sh | b.sh


  1. ssh hostname -Rport:localhost:22 -N
复制代码

-N is used for port forwarding.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 09:16:13 | 显示全部楼层
-N 的意思是不发送命令到远端,只做端口转发。
这样就存在一个很大的问题,如果远端的机子当掉重启,或断线重连。
本地无法查觉。
每隔一段时间发几个字符过去,断线时,本地能查觉到tcp timeout.
回复 支持 反对

使用道具 举报

发表于 2005-8-30 12:09:50 | 显示全部楼层
Post by acguy
-N 的意思是不发送命令到远端,只做端口转发。
这样就存在一个很大的问题,如果远端的机子当掉重启,或断线重连。
本地无法查觉。
每隔一段时间发几个字符过去,断线时,本地能查觉到tcp timeout.

明白你的意思了。可是为什么本地无法察觉呢? port forwarding 之后相当于在另一端的指定端口开了sshd服务,如果通信中断,服务就终止了,自然能察觉到啊。另外,server端有TCPKeepAlive的option. 实验了一下你的script, 可是试不出断线重连的情况。我想通过ssh送字符一样要等待tcp timeout,如果不想等就得手动kill了进程。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 14:51:56 | 显示全部楼层
一个tcp连接,如果双方都不发送数据,将连接断开(比如剪断网线, 不是kill进程,因为进程关闭时会做tcp的关闭动作,另一方会收到。)。双方永远都无法察觉
如果有一方在发送数据,在一定时间内收不到ack,发送方将认为tcp中断。这个时间与tcp的发送delay与timeout设定有关。
我的实验是大概二十多分钟才timeout.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-30 15:00:53 | 显示全部楼层
看了ssh的资料,
好象配置文件中有两个参数可以达到这个效果
ServerAliveInterval
ServerAliveCountMax
回复 支持 反对

使用道具 举报

发表于 2005-8-30 22:06:24 | 显示全部楼层
Post by acguy
一个tcp连接,如果双方都不发送数据,将连接断开(比如剪断网线, 不是kill进程,因为进程关闭时会做tcp的关闭动作,另一方会收到。)。双方永远都无法察觉
如果有一方在发送数据,在一定时间内收不到ack,发送方将认为tcp中断。这个时间与tcp的发送delay与timeout设定有关。
我的实验是大概二十多分钟才timeout.

ifdown interface或shutdown network就可以达到目的了。我的意思是上面的script断线重连一样要等待tcp timout,那还不如自己kill了进程重连来的快。
回复 支持 反对

使用道具 举报

发表于 2005-8-30 22:19:43 | 显示全部楼层
Post by acguy
看了ssh的资料,
好象配置文件中有两个参数可以达到这个效果
ServerAliveInterval
ServerAliveCountMax

no Server..., but Client....
Yes, this will help eliminate the tcp timout time cause server will notice itself if the client is no long responding...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表