V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
LonnyWong
V2EX  ›  程序员

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

  •  4
     
  •   LonnyWong · 2023-06-03 23:58:21 +08:00 · 4687 次点击
    这是一个创建于 568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开源地址: 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 条回复    2023-08-08 12:05:11 +08:00
    mywaiting
        1
    mywaiting  
       2023-06-04 00:20:14 +08:00
    赞~ 已经用上~
    dianso
        2
    dianso  
       2023-06-04 01:31:20 +08:00
    能支持 tabby 那种拆分吗?
    LonnyWong
        3
    LonnyWong  
    OP
       2023-06-04 01:39:32 +08:00 via iPhone
    @dianso 发一些 “tabby 那种拆分”的网页来看看?我比较少用 tabby ,不太清楚是个什么样的功能。
    dianso
        4
    dianso  
       2023-06-04 02:28:45 +08:00
    @LonnyWong #3 就是这样的

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

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

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

    ![screenshot-20230604-110231.png]( https://pic.sl.al/gdrive/pic/2023-06-04/647bfee479062.png)
    whisper98
        27
    whisper98  
       2023-06-04 11:04:18 +08:00
    我是一个想参与开源项目的 gopher ,不知道 op 需不需要人帮忙😂
    LonnyWong
        28
    LonnyWong  
    OP
       2023-06-04 11:30:10 +08:00
    @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
        29
    Wdafff  
       2023-06-04 11:43:09 +08:00
    安装后: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
        30
    LonnyWong  
    OP
       2023-06-04 11:46:17 +08:00 via iPhone
    samondlee
        31
    samondlee  
       2023-06-05 08:56:22 +08:00
    你好,如果服务器地址是域名的话,是否支持优先解析 AAAA IPV6 地址呢。
    LonnyWong
        32
    LonnyWong  
    OP
       2023-06-05 09:21:41 +08:00 via iPhone
    @samondlee 建连接是这一行: https://github.com/trzsz/trzsz-ssh/blob/e5fd8424f371fc35243d23b7afb1e784b956af07/login.go#L526

    第一个参数是 tcp ,并没有指定 tcp4 或 tcp6 ,按理说是优先 ipv6 的。
    LonnyWong
        33
    LonnyWong  
    OP
       2023-08-08 12:05:11 +08:00
    @dianso @scyuns 已支持批量登录和 tmux 分屏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:04 · PVG 10:04 · LAX 18:04 · JFK 21:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.