客户端 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 75 天前 via Android
有性能测试结果吗
|
![]() |
2
LonnyWong OP @zeusho871 暂时没有,可以先参考 KCP 的性能,默认有点慢,加了行 no delay 就好很多了,https://github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08
|
3
cheneven 75 天前
问下,这个服务落地场景有哪些呀,比如,受到网络环境关系,ssh 慢,所以用 tsshd 的 udp 功能?
|
![]() |
4
xuan_lengyue 75 天前
@cheneven 海外 VPS 吧
|
5
cheneven 75 天前
@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 75 天前
ssh 一部分用途是传输大文件,而 udp 数据量一多,运营商就会不开心,给你断流。于是大家都再加了一层 udp2raw ,伪装成 tcp 流量。
不伪装就需要随机端口。 |
![]() |
8
LonnyWong OP @tool2dx 再结合 udp2raw 确实会更好,但好像要求 root 启动,或者要加权限 sudo setcap cap_net_raw+ep ...
如果有需求的人多,等有空时,再看看怎么与 udp2raw 结合在一起使用。 |
![]() |
9
mightybruce 75 天前
用这个接管 sshd, 万一没启动起来,那真的要骂娘了。
大文件传输 一般用的是 rsync |
![]() |
10
LonnyWong OP @mightybruce tsshd 的本质是实现了 sshd 类似的功能,但是 tsshd 并没有替换 sshd ,他们是同时存在,互不影响的。
|
![]() |
11
rrfeng 75 天前
ssh - ssh - ssh 带 proxy 的情况支持吗 #🐶
|
![]() |
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 75 天前
太强了!这个网络中断之后能自动重连吗?
|
![]() |
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 75 天前 ![]() 一直在用大佬的 trzsz-ssh ,很好用,期待项目进化!支持~
|
![]() |
19
swananan 75 天前 ![]() 这个挺好的。
正好我半个月前,需要跨国访问家里内网,因为延迟比较大,我就自己写了一个 kcp or quic 的 4 层代理( pure c )。 因为之前自娱自乐,给 kcp 和 quic ( ngtcp2 )包了一个框架,所以开发成本并不算高。 |
![]() |
20
swananan 75 天前
如果早点看到这个的话,可能就不用自己浪费一晚上写个 proxy 了
|
![]() |
21
huaxianyan 75 天前 ![]() 用了 tssh 很久了,一直都习惯维护 sshconfig 这种方式来上服务器,tssh 不装服务端也可以无缝兼容(当然不需要额外功能的情况下)
|
![]() |
22
chinni 75 天前
问一下 滚动缓存 问题 mosh 一直支持不太好 这个怎么样?
|
![]() |
24
JohnSmith 74 天前
可以作为 vscode ssh remote 来用吗
|