• 请不要在回答技术问题时复制粘贴 AI 生成的内容
LonnyWong
V2EX  ›  程序员

用 go 实现 ssh 客户端(千行左右的代码),一般人用到的 ssh 功能都已支持。

  •  4
     
  •   LonnyWong · Jun 3, 2023 · 6076 views
    This topic created in 1253 days ago, the information mentioned may be changed or developed.

    开源地址: https://github.com/trzsz/trzsz-ssh

    tssh 已实现 ssh 客户端常用的基本功能( 除了 ssh 端口转发 ),一般人用到的 ssh 功能都已支持,欢迎各位大佬试用。

    两大额外功能( 亮点 ):

    1 、支持选择( 搜索 )~/.ssh/config 中的服务器,进行登录。相当于 tssh 内置了服务器管理功能,并且类似 vim 的操作方式不需要用到鼠标。

    2 、tssh 内置支持 trzsz ( trz / tsz ),这在 Windows 平台很有用,解决了 trzsz ssh 上传速度慢的问题。

    录屏演示

    PS:通过用 go 写一个 ssh 客户端,对 ssh 的原理了解更深入了,特别是 ProxyJump 和 ProxyCommand 相关逻辑。

    33 replies  •  2023-08-08 12:05:11 +08:00
    mywaiting
    mywaiting
    Jun 4, 2023
    1
    赞~ 已经用上~
    dianso
    dianso
    Jun 4, 2023
    2
    能支持 tabby 那种拆分吗?
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    3
    @dianso 发一些 “tabby 那种拆分”的网页来看看?我比较少用 tabby ,不太清楚是个什么样的功能。
    dianso
    dianso
    Jun 4, 2023
    4
    @LonnyWong #3 就是这样的

    ![cb72a3c7ef9060d9adcab865547c5442.png]( https://i.mjj.rip/2023/06/04/cb72a3c7ef9060d9adcab865547c5442.png)
    dianso
    dianso
    Jun 4, 2023
    5
    ![cb72a3c7ef9060d9adcab865547c5442.png( https://i.mjj.rip/2023/06/04/cb72a3c7ef9060d9adcab865547c5442.png)
    scyuns
    scyuns
    Jun 4, 2023 via Android
    6
    赞,看起来挺不错。能支持批量脚本吗
    yjd
    yjd
    Jun 4, 2023
    7
    之前弄连接用 https://github.com/PowerShell/Win32-OpenSSH ,下次有机会试试
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    8
    @scyuns 用的是 go 的 ssh 标准库 https://pkg.go.dev/golang.org/x/crypto/ssh ,是有能力支持批量脚本的。批量脚本想做成怎么样交互和执行的呢?
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    9
    @dianso 这种分屏,做的最好的是 tmux ,你可以将 tmux 结合 tssh 一起使用的。先用 tssh 登录服务器,然后在服务器上运行 tmux ,就可以用 tmux 的快捷键进行分屏了,具体用法可以网上搜一下 tmux 的教程。
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    10
    @scyuns 批量执行的工具,你可以看看这个 https://github.com/shanghai-edu/multissh ,也是用 go 的 ssh 库实现的。如果你有更好的想法,也可以提出来。
    jack4536251
    jack4536251
    Jun 4, 2023 via Android
    11
    能讲下其中的原理吗?
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    12
    @jack4536251 刚搜脚本批量运行,找到了 https://cloud.tencent.com/developer/article/1187651 ,说的挺详细的,你可以先看看。tssh 也是类似的。
    Monad
    Monad
    Jun 4, 2023 via iPhone
    13
    想了解一下是否能够内置支持 proxycommand 中通过 nc/corkscrew 的功能?在 Windows 上用 nc.exe 会有奇怪的卡顿感(类似于延迟很高的情况) 但是走 proxifier 则不会 所以怀疑是 nc.exe 的问题
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023❤️1
    14
    @Monad ProxyCommand 其实是旧的代理方式了,新的是 ProxyJump 。如果你的代理是 http 协议,那 ProxyJump 搞不定。如果你只是用 ProxyCommand 经过某个跳板机,完全可以用 ProxyJump 代替。

    具体可以发你的 ProxyCommand 出来看看?可以把敏感的信息打个掩码之类。
    Monad
    Monad
    Jun 4, 2023
    15
    @LonnyWong ProxyCommand C:\ncat.exe --proxy-type socks4 --proxy 192.168.1.1:1337 %h %p
    走的是局域网内的某个 ssh 本地转发的 socks 端口,但是这个版本不支持 socks5 所以指定 socks4
    ncat.exe (不是 nc.exe ,一直搞混这两个...)是这里的 https://nmap.org/ncat/
    AnroZ
    AnroZ
    Jun 4, 2023❤️1
    16
    虽然目前用不太到,star 支持
    acerphoenix
    acerphoenix
    Jun 4, 2023
    17
    这个不错,好像是我的菜。
    我目前用 windterm ,但有点小问题,windows terminal 能解决,但 windows terminal 不支持 rzsz ,如果我没理解错的话,你这个是相当于把一个 windows terminal 的终端强化成支持 rzsz 的?
    我 windows terminal 可以配置一些 profile ,然后在新建 tab 时选择 profile 就进了不同的服务器,用这个,就是在新建 tab 里执行 tssh ,然后再选择服务器就可以了吧?
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    18
    @acerphoenix 是的,在新 tab 里执行 tssh ,这时可以选择在 C:\Users\your_name\.ssh\config 中配置好的服务器( 这个配置要自己手写,兼容标准 ssh 的 ),选中某个服务器登录后,就可以使用 trz / tsz 上传和下载了。如果 tssh 带有参数,就和标准 ssh 几乎一样。
    Monad
    Monad
    Jun 4, 2023
    19
    @LonnyWong 感谢 ProxyJump 的思路,之前完全没有了解到这个信息~用这个好很多了。
    bequt
    bequt
    Jun 4, 2023
    20
    @LonnyWong LTSC 版本上为啥不跳出传送文件窗口呢,是不支持 powershell 终端吗?
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    21
    @Monad ProxyCommand 其实是经过了 stdin 和 stdout 的,这个我严重怀疑是 Windows 的锅,不管什么程序的 stdin 都超级慢。这也是 https://github.com/trzsz/trzsz-go 在 Windows 中上传慢的根本原因。
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    22
    @bequt 支持 cmd 和 powershell 的,没弹出也没有报错?方便截个图看看?
    Monad
    Monad
    Jun 4, 2023
    23
    @LonnyWong 嗯 不过走 ProxyJump 的话 登陆的时候延迟高了起来,不过因为只有开始的时候延迟到也能接受。
    bequt
    bequt
    Jun 4, 2023
    24
    @LonnyWong 可以用,没问题。

    但是为啥 icon 是乱码呢。。。。
    ![20230604-103722.jpg]( https://pic.sl.al/gdrive/pic/2023-06-04/647bf92257bf6.jpg)
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    25
    @bequt 字符集编码不是 UTF-8 的?
    bequt
    bequt
    Jun 4, 2023
    26
    @LonnyWong 感觉不像,也不知道什么情况,凑合着用吧。已 star

    ![screenshot-20230604-110231.png]( https://pic.sl.al/gdrive/pic/2023-06-04/647bfee479062.png)
    whisper98
    whisper98
    Jun 4, 2023
    27
    我是一个想参与开源项目的 gopher ,不知道 op 需不需要人帮忙😂
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023
    28
    @whisper98 热烈欢迎参与。现在 trzsz 相关的 go 开源有两个项目:

    1 、https://github.com/trzsz/trzsz-ssh 就是这个 tssh 项目,计划会将 ssh 客户端的常用功能用 go 都实现出来。
    我计划下周末搞的是 -L -R -D -W 这几个 ssh 端口转发相关的功能。

    2 、https://github.com/trzsz/trzsz-go 是这个 tssh 依赖的项目,主要实现 trz / tsz 上传和下载。
    有几个功能想加的:
    2.1 https://github.com/trzsz/trzsz-go/issues/28 中说到的第 7 点。
    2.2 https://github.com/trzsz/trzsz-go/issues/27 中说到的第 1 点,在用户 ctrl + c 中止时,弹出个确认窗口,一方面可以选择删除已传部分或保留,一方面防止误触。
    2.3 https://github.com/trzsz/trzsz-go/issues/10 说到的断点续传功能,这个改动量稍微有点大。
    Wdafff
    Wdafff
    Jun 4, 2023
    29
    安装后:trz: The term 'trz' is not recognized as a name of a cmdlet, function, script file, or executable program.
    Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    LonnyWong
    LonnyWong
    OP
    Jun 4, 2023 via iPhone
    30
    samondlee
    samondlee
    Jun 5, 2023
    31
    你好,如果服务器地址是域名的话,是否支持优先解析 AAAA IPV6 地址呢。
    LonnyWong
    LonnyWong
    OP
    Jun 5, 2023 via iPhone
    32
    @samondlee 建连接是这一行: https://github.com/trzsz/trzsz-ssh/blob/e5fd8424f371fc35243d23b7afb1e784b956af07/login.go#L526

    第一个参数是 tcp ,并没有指定 tcp4 或 tcp6 ,按理说是优先 ipv6 的。
    LonnyWong
    LonnyWong
    OP
    Aug 8, 2023
    33
    @dianso @scyuns 已支持批量登录和 tmux 分屏
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   692 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 22:25 · PVG 06:25 · LAX 14:25 · JFK 17:25
    ♥ Do have faith in what you're doing.