Closed Hentioe closed 4 months ago
我不是很确定你是想要哪一种:
1、让 trz / tsz 支持 mosh,运行 trzsz mosh xxx
登录服务器之后,使用 trz / tsz 上传和下载文件。
2、让 tssh 像 mosh 那样支持 udp 协议,在服务器安装 tssh-server
代替 mosh-server
,在客户端运行 tssh --udp
代替 mosh
。
我对这个项目的理解应该是错了 我一开始从 gif 录屏看到这个项目 我误以为这是个命令行管理 ssh 连接配置,然后调用本地的 ssh 来创建连接的工具。实际上这是一个 ssh 客户端的完整实现。那支持 Mosh 的工作量和复杂度就可能很大了。
如果你未来有这个打算的话,我建议是兼容 Mosh 的协议(就是用户的服务器仍然安装的是 mosh-server
),因为它做得已经很好了。跟 Mosh 一样通过 SSH 连接来认证。你提到的 trz / tsz 我暂时还未了解,我发现这个项目主要还是为了找到方便的支持多连接管理的开源 ssh 客户端。
兼容 mosh 协议,就会受限于它,想要支持一些新功能,例如端口转发,将会变得束手束脚。
好的 那这个 issue 我先关闭了 期待支持 udp 的那一天
前几个周末都在写,已经写的差不多了,只是还没测完,暂时还没提交代码。
已实现,用法请参考 UDP 模式。
服务端 tsshd(相当于 mosh-server ) 开源地址:https://github.com/trzsz/tsshd
在服务器上安装 tsshd
( 暂时要用 go install
安装 ):
go install github.com/trzsz/tsshd/cmd/tsshd@main
在客户端上安装 tssh
( 这是 main 分支,预计要 v0.1.21
版本才正式支持 ):
go install github.com/trzsz/trzsz-ssh/cmd/tssh@main
tssh
登录时,加 --udp
参数启用,用 --tsshd-path
指定 tsshd
在服务器上的路径。~/.ssh/config
中如下配置( 命令行参数即可省略 ):
Host xxx
#!! UdpMode yes
#!! TsshdPath ~/go/bin/tsshd
@Hentioe 加了行 KCP no delay 之后,速度快了很多,https://github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08
已经在测试使用了,这第一个版本的可用性已经很高了👍
不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开 htop
这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。
不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开
htop
这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。
可能与 KCP 的某个参数有关,等我有空了研究看看。
@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 秒,我没有在配置中或命令中作出调整。
@Hentioe 你观察一下,卡住时,是不是切换 IP 了?等我有空时,再多支持 QUIC 协议,看会不会改善。
我在 udpKeepAlive
函数里打 log,发现心跳包貌似是一直保持收发的。也许不是连接问题,但还是一两分钟就会卡住。换 IP 肯定没这情况,我不是挂一两天,是没输入的话几分钟就卡住了。在高质量的连接下不会出现。
@lonnywong 我可以在美国服务器上创建一个虚拟机给你测试用。虚拟机允许来自 61000-62000 的 udp 流量,以及某个 ssh 端口流量。需要的话我可以发到你的邮箱里,是你资料上的 QQ 邮箱吗?这个服务器的网络情况就是我这边无操作时 100% 会中断。
@lonnywong 我可以在美国服务器上创建一个虚拟机给你测试用。虚拟机允许来自 61000-62000 的 udp 流量,以及某个 ssh 端口流量。需要的话我可以发到你的邮箱里,是你资料上的 QQ 邮箱吗?这个服务器的网络情况就是我这边无操作时 100% 会中断。
lonnywong@qq.com 是我的邮箱
已经发了
已经发了
我试了下,ssh 是可以登录上去的,等我抽空测试一下。谢谢。
啥时候发布1v0.1.21?
啥时候发布1v0.1.21?
暂时还没有发布的计划,你可以自己先编译来使用的。 Go 支持跨平台编译,可以找一个有 Go 的环境,自己编译任意平台的程序出来用。
这个周末除了支持 KCP 协议,还会再支持 QUIC 协议。
已经在测试使用了,这第一个版本的可用性已经很高了👍
不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开
htop
这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。
同遇到
已经在测试使用了,这第一个版本的可用性已经很高了👍 不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开
htop
这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。同遇到
感谢 @Hentioe 提供的测试机,我换了几种环境,终于复现出来了,预计本周末会解决。
1、在一个特定的网络,几乎完全连不通,看来是 UDP 被限制了。 2、在境内和香港的 VPS,连接那台测试机,没问题, 看来是网络质量太好了。 3、在一个访客的 wifi 中,没有限制 UDP,复现出来了,发现是 KCP 建多个连接的问题。
已经在测试使用了,这第一个版本的可用性已经很高了👍
不过我这边也有遇到明显的问题。如果一直在控制台操作,或者打开
htop
这种会一直刷新内容的程序,连接几乎不会断开。但一旦我不做任何操作,没有输入也没有输出,基本上 1-2 分钟就会卡住。这时候服务端的 tsshd 进程还在的,但跟进程被杀死的结果一样。
已解决卡住的问题,另外支持了 QUIC 协议( 默认是 QUIC 协议,将来支持连接切换 ),可如下配置协议:
Host kcp
#!! UdpMode KCP
#!! TsshdPath ~/go/bin/tsshd
Host quic
#!! UdpMode QUIC
#!! TsshdPath ~/go/bin/tsshd
是不是哪里搞错了。如果我配置 #!! 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 支持始终超时。
大概率你还在用旧的 tssh
,which tssh
看看是哪个路径的,有没有用到新编译的 tssh
。
因为 tssh
还没改版本号,tssh -v
看不出来,可以 tssh -h
看看,新版本应该会输出下面这一行:
--udp ssh over UDP like mosh (default mode: QUIC)
另外,tsshd -v
看看是不是输出 trzsz sshd 0.1.1
。
尴尬了 我给忘了起初用 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 这样的场景不需要这么大的缓冲区?
其它没什么问题,短暂测试不会再卡住了。网络延迟的感觉不明显,效果很不错了。有什么不对的我再反馈给你。
有权限的话,调大一点好,传输大量数据时速度会快一些,可参考:https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes
sudo sysctl -w net.core.rmem_max=7500000
sudo sysctl -w net.core.wmem_max=7500000
相比于 SSH,Mosh 在网络不稳定的环境下有更好的体验。例如连接国外的服务器,基于 TCP 连接的 SSH 容易卡死。
Mosh 自身是复用 SSH 的连接配置的,包括身份认证。简单的连接把 ssh 命令换成 mosh 就可以了。传递 ssh 参数时要通过
--ssh
选项。例如指定端口:有一个商业的 GUI SSH 客户端叫 Termius,它可以让用户选择使用 Mosh 还是 SSH。我打算尝试用 tssh 替代任何 GUI 客户端。希望能支持 Mosh。