V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LonnyWong
V2EX  ›  程序员

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

  •  4
     
  •   LonnyWong · 289 天前 · 4202 次点击
    这是一个创建于 289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开源地址: 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  
       289 天前
    赞~ 已经用上~
    dianso
        2
    dianso  
       289 天前
    能支持 tabby 那种拆分吗?
    LonnyWong
        3
    LonnyWong  
    OP
       289 天前 via iPhone
    @dianso 发一些 “tabby 那种拆分”的网页来看看?我比较少用 tabby ,不太清楚是个什么样的功能。
    dianso
        4
    dianso  
       289 天前
    @LonnyWong #3 就是这样的

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

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

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

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

    第一个参数是 tcp ,并没有指定 tcp4 或 tcp6 ,按理说是优先 ipv6 的。
    LonnyWong
        33
    LonnyWong  
    OP
       224 天前
    @dianso @scyuns 已支持批量登录和 tmux 分屏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3521 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:58 · PVG 18:58 · LAX 03:58 · JFK 06:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.