leffss / gowebssh

Webssh implemented by github.com/gorilla/websocket and golang.org/x/crypto/ssh
MIT License
80 stars 25 forks source link

长时间不动,服务端会输出EOF #1

Closed anlityli closed 4 years ago

anlityli commented 4 years ago

长时间不动,没有任何输入,再次输入服务端会EOF,此时ssh可能是与服务器已经断开连接了。能否增加心跳,来保活?

leffss commented 4 years ago

这个项目只是试验性的,如果真的要加入堡垒机,是需要考虑这方面的东西的

anlityli commented 4 years ago

leffss commented 4 years ago

捕获

我测试了一下,闲置了10几个小时都没有断开呢,你的具体情况是?

anlityli commented 4 years ago

我链接的是阿里云服务器,可能阿里云对长连接的时间有控制,然后我用定时器,每隔一段时间发送了一个包解决了这个问题。谢谢!

leffss commented 4 years ago

我链接的是阿里云服务器,可能阿里云对长连接的时间有控制,然后我用定时器,每隔一段时间发送了一个包解决了这个问题。谢谢!

能否分享一下你的具体实现代码呢?

anlityli commented 4 years ago

你的服务器能链接10几个小时不断,可能是服务器的/etc/ssh/ssh_config文件配置了

TCPKeepAlive yes
ServerAliveInterval 30

我的代码是在 newSSHXtermSession方法中加了一个定时器,定时器内的代码是:

if _, err := session.SendRequest("keepalive@golang.org", true, nil); err != nil {
    errors.Wrap(err, "failed to send keep alive")
}
leffss commented 4 years ago

你的服务器能链接10几个小时不断,可能是服务器的/etc/ssh/ssh_config文件配置了

我的服务器不断那是因为TMOUT的设置的原因,我是意思分享下你的心跳方案

anlityli commented 4 years ago

定时器,我用的是gf框架带的时间轮定时器,因为go默认的定时器可能有性能问题

leffss commented 4 years ago

定时器,我用的是gf框架带的时间轮定时器,因为go默认的定时器可能有性能问题

比如说你采用了gf定时器,到了一定时间后会向后端服务器发送什么心跳数据呢?

anlityli commented 4 years ago

我上面发了代码了

anlityli commented 4 years ago
if _, err := session.SendRequest("keepalive@golang.org", true, nil); err != nil {
    errors.Wrap(err, "failed to send keep alive")
}
leffss commented 4 years ago

看到了,谢谢,学习了

anlityli commented 4 years ago

客气,我从你的代码中学到的更多!😁