
客户端 tssh :https://github.com/trzsz/trzsz-ssh
服务端 tsshd :https://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 中配置的机器,可选择登录,如图:

1 zeusho871 2024-06-24 08:28:04 +08:00 via Android 有性能测试结果吗 |
2 LonnyWong OP @zeusho871 暂时没有,可以先参考 KCP 的性能,默认有点慢,加了行 no delay 就好很多了,https://github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08 |
3 cheneven 2024-06-24 10:07:45 +08:00 问下,这个服务落地场景有哪些呀,比如,受到网络环境关系,ssh 慢,所以用 tsshd 的 udp 功能? |
4 xuan_lengyue 2024-06-24 10:12:19 +08:00 @cheneven 海外 VPS 吧 |
5 cheneven 2024-06-24 10:14:49 +08:00 @xuan_lengyue 了解了 |
6 LonnyWong OP @cheneven 主要是对标 mosh: https://github.com/mobile-shell/mosh 在网络质量不是很好的场景( 例如,跨境的网络 ),TCP 的延迟可能会比较大( 例如,按下键盘比较久后,屏幕上才显示输入的字母,卡顿感比较明显 ),甚至可能 TCP 中断卡死了。 使用 UDP ( 这里用了 KCP 的实现,站在巨人的肩膀上 ),可以优化 TCP 延迟大的问题,改善 ssh 后的输入体验。 有人在 tssh 的 issue 提出 https://github.com/trzsz/trzsz-ssh/issues/117 ,而碰巧我知道怎么实现,于是就造了这个轮子,顺便支持( mosh 目前还不支持的 )端口转发。 |
7 tool2dx 2024-06-24 10:27:26 +08:00 ssh 一部分用途是传输大文件,而 udp 数据量一多,运营商就会不开心,给你断流。于是大家都再加了一层 udp2raw ,伪装成 tcp 流量。 不伪装就需要随机端口。 |
8 LonnyWong OP @tool2dx 再结合 udp2raw 确实会更好,但好像要求 root 启动,或者要加权限 sudo setcap cap_net_raw+ep ... 如果有需求的人多,等有空时,再看看怎么与 udp2raw 结合在一起使用。 |
9 mightybruce 2024-06-24 10:40:36 +08:00 用这个接管 sshd, 万一没启动起来,那真的要骂娘了。 大文件传输 一般用的是 rsync |
10 LonnyWong OP @mightybruce tsshd 的本质是实现了 sshd 类似的功能,但是 tsshd 并没有替换 sshd ,他们是同时存在,互不影响的。 |
11 rrfeng 2024-06-24 11:14:06 +08:00 ssh - ssh - ssh 带 proxy 的情况支持吗 # |
12 LonnyWong OP @rrfeng #11 如果 UDP 无法直通,现在还不支持哈。如果要支持,得在中间那里运行一个进程来转发,相当的复杂,但不是完全不可能。 |
13 LonnyWong OP @rrfeng #11 如果只是想第一跳是 UDP ,后面的是 TCP ,那现在是支持的,如: tssh -oProxyCommand='tssh --udp -W x.x.x.x:22 A' B 这样,到 A 是用 UDP ,再到 B 是用 TCP 。 |
14 yushi17 2024-06-24 11:50:31 +08:00 太强了!这个网络中断之后能自动重连吗? |
15 LonnyWong OP @yushi17 #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 |
16 LonnyWong OP #15 --tssh-path 写错了,应该是 --tsshd-path |
18 GoodRui 2024-06-24 12:15:11 +08:00 一直在用大佬的 trzsz-ssh ,很好用,期待项目进化!支持~ |
19 swananan 2024-06-24 13:16:27 +08:00 这个挺好的。 正好我半个月前,需要跨国访问家里内网,因为延迟比较大,我就自己写了一个 kcp or quic 的 4 层代理( pre c )。 因为之前自娱自乐,给 kcp 和 quic ( ngtcp2 )包了一个框架,所以开发成本并不算高。 |
20 swananan 2024-06-24 13:16:55 +08:00 如果早点看到这个的话,可能就不用自己浪费一晚上写个 proxy 了 |
21 huaxianyan 2024-06-24 13:20:06 +08:00 用了 tssh 很久了,一直都习惯维护 sshconfig 这种方式来上服务器,tssh 不装服务端也可以无缝兼容(当然不需要额外功能的情况下) |
22 chinni 2024-06-24 20:32:25 +08:00 问一下 滚动缓存 问题 mosh 一直支持不太好 这个怎么样? |
24 JohnSmith 2024-06-25 15:54:36 +08:00 可以作为 vscode ssh remote 来用吗 |