trzsz / trzsz-ssh

trzsz-ssh ( tssh ) is an ssh client designed as a drop-in replacement for the openssh client. It aims to provide complete compatibility with openssh, mirroring all its features, while also offering additional useful features. Such as login prompt, batch login, remember password, automated interaction, trzsz, zmodem(rz/sz), udp mode like mosh, etc.
https://trzsz.github.io/ssh
MIT License
1.74k stars 102 forks source link

Mosh 支持 #117

Closed Hentioe closed 4 months ago

Hentioe commented 5 months ago

相比于 SSH,Mosh 在网络不稳定的环境下有更好的体验。例如连接国外的服务器,基于 TCP 连接的 SSH 容易卡死。

Mosh 自身是复用 SSH 的连接配置的,包括身份认证。简单的连接把 ssh 命令换成 mosh 就可以了。传递 ssh 参数时要通过 --ssh 选项。例如指定端口:

mosh --ssh='ssh -p 2222' root@192.168.1.1

有一个商业的 GUI SSH 客户端叫 Termius,它可以让用户选择使用 Mosh 还是 SSH。我打算尝试用 tssh 替代任何 GUI 客户端。希望能支持 Mosh。

lonnywong commented 5 months ago

我不是很确定你是想要哪一种:

1、让 trz / tsz 支持 mosh,运行 trzsz mosh xxx 登录服务器之后,使用 trz / tsz 上传和下载文件。

2、让 tssh 像 mosh 那样支持 udp 协议,在服务器安装 tssh-server 代替 mosh-server,在客户端运行 tssh --udp 代替 mosh

Hentioe commented 5 months ago

我对这个项目的理解应该是错了 我一开始从 gif 录屏看到这个项目 我误以为这是个命令行管理 ssh 连接配置,然后调用本地的 ssh 来创建连接的工具。实际上这是一个 ssh 客户端的完整实现。那支持 Mosh 的工作量和复杂度就可能很大了。

如果你未来有这个打算的话,我建议是兼容 Mosh 的协议(就是用户的服务器仍然安装的是 mosh-server),因为它做得已经很好了。跟 Mosh 一样通过 SSH 连接来认证。你提到的 trz / tsz 我暂时还未了解,我发现这个项目主要还是为了找到方便的支持多连接管理的开源 ssh 客户端。

lonnywong commented 5 months ago

兼容 mosh 协议,就会受限于它,想要支持一些新功能,例如端口转发,将会变得束手束脚。

Hentioe commented 4 months ago

好的 那这个 issue 我先关闭了 期待支持 udp 的那一天

lonnywong commented 4 months ago

前几个周末都在写,已经写的差不多了,只是还没测完,暂时还没提交代码。

lonnywong commented 4 months ago

已实现,用法请参考 UDP 模式

服务端 tsshd(相当于 mosh-server ) 开源地址:https://github.com/trzsz/tsshd

安装方法

使用方法

lonnywong commented 4 months ago

@Hentioe 加了行 KCP no delay 之后,速度快了很多,https://github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08

Hentioe commented 4 months ago

已经在测试使用了,这第一个版本的可用性已经很高了👍

不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开 htop 这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。

lonnywong commented 4 months ago

不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开 htop 这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。

可能与 KCP 的某个参数有关,等我有空了研究看看。

lonnywong commented 4 months ago

@Hentioe 我用 tssh --udp 登录后,30 分钟没有任何输入和输出,没发现卡住的现象。 1、是两台虚拟机,网络质量超级好,这样的环境可能不好复现。 2、服务器上是这样安装的 go install github.com/trzsz/tsshd/cmd/tsshd@main,注意是 main 分支。 3、客户端也是当前最新的 go install github.com/trzsz/trzsz-ssh/cmd/tssh@main,没有改过什么。 4、有一个 UdpAliveTimeout 参数的,默认 100 秒,我没有在配置中或命令中作出调整。

lonnywong commented 4 months ago

@Hentioe 你观察一下,卡住时,是不是切换 IP 了?等我有空时,再多支持 QUIC 协议,看会不会改善。

Hentioe commented 4 months ago

我在 udpKeepAlive 函数里打 log,发现心跳包貌似是一直保持收发的。也许不是连接问题,但还是一两分钟就会卡住。换 IP 肯定没这情况,我不是挂一两天,是没输入的话几分钟就卡住了。在高质量的连接下不会出现。

Hentioe commented 4 months ago

@lonnywong 我可以在美国服务器上创建一个虚拟机给你测试用。虚拟机允许来自 61000-62000 的 udp 流量,以及某个 ssh 端口流量。需要的话我可以发到你的邮箱里,是你资料上的 QQ 邮箱吗?这个服务器的网络情况就是我这边无操作时 100% 会中断。

lonnywong commented 4 months ago

@lonnywong 我可以在美国服务器上创建一个虚拟机给你测试用。虚拟机允许来自 61000-62000 的 udp 流量,以及某个 ssh 端口流量。需要的话我可以发到你的邮箱里,是你资料上的 QQ 邮箱吗?这个服务器的网络情况就是我这边无操作时 100% 会中断。

lonnywong@qq.com 是我的邮箱

Hentioe commented 4 months ago

已经发了

lonnywong commented 4 months ago

已经发了

我试了下,ssh 是可以登录上去的,等我抽空测试一下。谢谢。

lifei commented 4 months ago

啥时候发布1v0.1.21?

lonnywong commented 4 months ago

啥时候发布1v0.1.21?

暂时还没有发布的计划,你可以自己先编译来使用的。 Go 支持跨平台编译,可以找一个有 Go 的环境,自己编译任意平台的程序出来用。

这个周末除了支持 KCP 协议,还会再支持 QUIC 协议。

lifei commented 4 months ago

已经在测试使用了,这第一个版本的可用性已经很高了👍

不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开 htop 这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。

同遇到

lonnywong commented 4 months ago

已经在测试使用了,这第一个版本的可用性已经很高了👍 不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开 htop 这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。

同遇到

感谢 @Hentioe 提供的测试机,我换了几种环境,终于复现出来了,预计本周末会解决。

1、在一个特定的网络,几乎完全连不通,看来是 UDP 被限制了。 2、在境内和香港的 VPS,连接那台测试机,没问题, 看来是网络质量太好了。 3、在一个访客的 wifi 中,没有限制 UDP,复现出来了,发现是 KCP 建多个连接的问题。

lonnywong commented 4 months ago

已经在测试使用了,这第一个版本的可用性已经很高了👍

不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开 htop 这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。

已解决卡住的问题,另外支持了 QUIC 协议( 默认是 QUIC 协议,将来支持连接切换 ),可如下配置协议:

Host kcp
    #!! UdpMode KCP
    #!! TsshdPath ~/go/bin/tsshd

Host quic
    #!! UdpMode QUIC
    #!! TsshdPath ~/go/bin/tsshd
Hentioe commented 4 months ago

是不是哪里搞错了。如果我配置 #!! UdpMode KCP#!! UdpMode QUIC,tssh 实际上不会用这些协议,连服务端的 tsshd 都不会启动(服务器上看不到进程)。就是普通的 ssh 连接,查看本地连接信息可以看到和远程服务器一直保持着 tcp 的 ssh 连接。

如果是之前的 #!! UdpMode yes 配置,这次会启动 tsshd 了,并且还启动成功了。但连不上,会出现这个错误:kcp new session [74.208.172.111:61593] [bus] timeout

tssh 和 tsshd 都是用最新的代码编译的。不只是一个服务器,是所有服务器都是这样。所有我想是不是哪里搞错了,配置还是什么方面。目前 KCP 和 QUIC 没法尝试,最初的 udp 支持始终超时。

lonnywong commented 4 months ago

大概率你还在用旧的 tsshwhich tssh 看看是哪个路径的,有没有用到新编译的 tssh

因为 tssh 还没改版本号,tssh -v 看不出来,可以 tssh -h 看看,新版本应该会输出下面这一行:

  --udp                  ssh over UDP like mosh (default mode: QUIC)

另外,tsshd -v 看看是不是输出 trzsz sshd 0.1.1

Hentioe commented 4 months ago

尴尬了 我给忘了起初用 go 安装过一次 后面一直用系统包管理器打包最新的代码 其实一直用的是最初 go 安装的那个版本。现在正常了,我初步测试下来 KCP 和 QUIC 都没什么问题,但是 QUIC 连接后会有一条日志:

2024/07/01 12:00:31 failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 7168 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details.

这个缓冲区设置是不是太大了,是否 ssh 这样的场景不需要这么大的缓冲区?

其它没什么问题,短暂测试不会再卡住了。网络延迟的感觉不明显,效果很不错了。有什么不对的我再反馈给你。

lonnywong commented 4 months ago

有权限的话,调大一点好,传输大量数据时速度会快一些,可参考:https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes