开源地址
客户端 tssh : github.com/trzsz/trzsz-ssh
服务端 tsshd : github.com/trzsz/tsshd
基本原理
tssh 是一个 go 实现的 ssh 客户端( 已经 1.4K 的 Star 了,感谢大家的支持 ),--udp 是一个新功能。
当使用 tssh —udp 登录时,将在服务器上启动一个新的 tsshd 进程,tsshd 输出 UDP 端口和密钥( tssh 作为 ssh 客户端,可以安全地接收到 )。
然后 tssh 关闭 ssh 的 TCP 连接,再使用 UDP ( KCP ) 与 tsshd 通讯( tsshd 在这里开始承担 sshd 的角色 )。
原理和 mosh 差不多,比 mosh 多了端口转发。
安装方法

在服务器上安装 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

界面截屏
tssh 可以当作 ssh 来使用,常用的功能都兼容。不带参数启动时,会列出 ~/.ssh/config 中配置的机器,可选择登录,如图:

有性能测试结果吗

暂时没有,可以先参考 KCP 的性能,默认有点慢,加了行 no delay 就好很多了, github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08

问下,这个服务落地场景有哪些呀,比如,受到网络环境关系,ssh 慢,所以用 tsshd 的 udp 功能?

海外 VPS 吧

了解了

主要是对标 mosh: github.com/mobile-shell/mosh在网络质量不是很好的场景( 例如,跨境的网络 ),TCP 的延迟可能会比较大( 例如,按下键盘比较久后,屏幕上才显示输入的字母,卡顿感比较明显 ),甚至可能 TCP 中断卡死了。使用 UDP ( 这里用了 KCP 的实现,站在巨人的肩膀上 ),可以优化 TCP 延迟大的问题,改善 ssh 后的输入体验。有人在 tssh 的 issue 提出 github.com/trzsz/trzsz-ssh/issues/117 ,而碰巧我知道怎么实现,于是就造了这个轮子,顺便支持( mosh 目前还不支持的 )端口转发。

ssh 一部分用途是传输大文件,而 udp 数据量一多,运营商就会不开心,给你断流。于是大家都再加了一层 udp2raw ,伪装成 tcp 流量。不伪装就需要随机端口。

再结合 udp2raw 确实会更好,但好像要求 root 启动,或者要加权限 sudo setcap cap_net_raw+ep ...如果有需求的人多,等有空时,再看看怎么与 udp2raw 结合在一起使用。

用这个接管 sshd, 万一没启动起来,那真的要骂娘了。大文件传输 一般用的是 rsync

tsshd 的本质是实现了 sshd 类似的功能,但是 tsshd 并没有替换 sshd ,他们是同时存在,互不影响的。

ssh - ssh - ssh 带 proxy 的情况支持吗 #🐶

#11 如果 UDP 无法直通,现在还不支持哈。如果要支持,得在中间那里运行一个进程来转发,相当的复杂,但不是完全不可能。

#11 如果只是想第一跳是 UDP ,后面的是 TCP ,那现在是支持的,如:tssh -oProxyCommand='tssh --udp -W x.x.x.x:22 A' B这样,到 A 是用 UDP ,再到 B 是用 TCP 。

太强了!这个网络中断之后能自动重连吗?

#14 应该可以自动重连的,不过我没有测过,你可以帮忙测一测,然后告诉我结果。有一个配置项 UdpAliveTimeout ,默认是 100 ( 秒 ),超时的话会 tsshd 会自动退出。看你需要在多久之内能重连,要改一下这个配置。在命令行中,可以这样指定 tssh --udp --tssh-path '~/go/bin/tsshd' -oUdpAliveTimeout=2000 xxx ,这样就是 2000 秒内,可以自动重连。如果 -oUdpAliveTimeout=0 则无论多久都可以重连(理论上),但是 tsshd 会常驻在服务器上,不会自己退出。也可以在 ~/.ssh/config 中配置,如:Host xxx #!! UdpMode yes #!! TsshdPath ~/go/bin/tsshd #!! UdpAliveTimeout 2000

#15 --tssh-path 写错了,应该是 --tsshd-path

等正式版 tssh release 吧,我木有 go

一直在用大佬的 trzsz-ssh ,很好用,期待项目进化!支持~

这个挺好的。正好我半个月前,需要跨国访问家里内网,因为延迟比较大,我就自己写了一个 kcp or quic 的 4 层代理( pure c )。因为之前自娱自乐,给 kcp 和 quic ( ngtcp2 )包了一个框架,所以开发成本并不算高。

如果早点看到这个的话,可能就不用自己浪费一晚上写个 proxy 了

用了 tssh 很久了,一直都习惯维护 sshconfig 这种方式来上服务器,tssh 不装服务端也可以无缝兼容(当然不需要额外功能的情况下)

问一下 滚动缓存 问题 mosh 一直支持不太好 这个怎么样?

#22 应该是没有滚动问题的,你可以试一下。