爱意满满的作品展示区。
lieyan

[开源] WinSSH,一个跨平台 SSH 客户端

  •  
  •   lieyan · 22h 47m ago · 1063 views

    这个产品我花了大量时间打磨,并且已经完全用在了我日常的工作中

    首先,我本身是 Termius 的长期订阅用户,Termius 带来跨端体验确实没得说,但就日常使用来看,很多操作都比较<不够直接>

    比如:

    1. SFTP 的操作,硬生生和 SSH 会话标签分开,这是最大不便。
    2. 服务器的管理界面逻辑,很傻,我都设立分组了,为啥不能出个树形视图?
    3. 还有端口转发,跟 SFTP 坐一桌

    Termius 订阅

    总之,综合这些使用体验,我自己写了一个符合日常使用直觉的 SSH 客户端,它就是 WinSSH !


    说来也是奇幻,早些年我技术还不够的时候就想做这样一款产品,名字也是叫 WinSSH ,甚至持有了 winssh.net 这个域名很长时间。

    当时想的就做 Windows 客户端,最早一版用 C#+WPF 手搓出来的,但是问题太多,最主要的问题就是终端渲染。

    当时我参考了一个叫 FluentTerminal 的开源项目,它是用 webview+xtermjs 解决终端渲染的问题,我第一版也是采用了类似的方案:CEF+xtermjs 。

    最后整体完成了不到 30%,但是基本的 shell+sftp 操作是没有问题的,再后来就直接鸽了~

    直到近几年 AI 彻底爆发,我又想到了 WinSSH ,我决定重新起航!


    在过去的几个月里,我反复琢磨,要怎么去做?使用何种技术栈?怎么去设计交互界面?

    最终选择了 electron+react+xtermjs+shadcn 这套成熟的体系,完成了跨平台桌面应用开发之旅!

    先来张图

    主界面

    怎么样?是不是很眼熟?哈哈哈哈,没错,我采用了 vscode 的设计风格,完全扁平+多标签页的操作!

    这里面我花了很多小心思在 SFTP 操作面板上

    例如支持平铺视图和树形视图切换 1780623294245.png

    相对丰富的右键菜单功能 1780623434523.png

    支持拖拽文件/目录到终端 1780623510150.png

    支持快捷跳转收藏/常用目录 1780623582514.png

    端口转发 1780623761114.png

    命令面板 1780623803138.png

    历史命令记录这里使用了OSC 133扩展协议,所以连接 SSH 时会向服务器上传并注入脚本,脚本代码如下

    __wsh_emit() { printf "\033]%s\033\134" "$1"; };
    __wsh_b64() { printf "%s" "$1" | base64 | tr -d "\n"; };
    if [ -n "$BASH_VERSION" ]; then
      __wsh_state=A;
      __wsh_pre() {
        [ -n "$COMP_LINE" ] && return;
        [ "$__wsh_state" = "C" ] && return;
        __wsh_emit "633;E;$(__wsh_b64 "$BASH_COMMAND")";
        __wsh_emit "133;C";
        __wsh_state=C;
      };
      __wsh_post() {
        __wsh_ec=$?;
        [ "$__wsh_state" = "C" ] && __wsh_emit "133;D;$__wsh_ec";
        __wsh_emit "133;P;Cwd=$PWD";
        __wsh_emit "133;A";
        __wsh_state=A;
      };
      trap "__wsh_pre" DEBUG;
      PROMPT_COMMAND="__wsh_post${PROMPT_COMMAND:+;$PROMPT_COMMAND}";
    elif [ -n "$ZSH_VERSION" ]; then
      __wsh_pre() {
        __wsh_emit "633;E;$(__wsh_b64 "$1")";
        __wsh_emit "133;C";
      };
      __wsh_post() {
        __wsh_ec=$?;
        __wsh_emit "133;D;$__wsh_ec";
        __wsh_emit "133;P;Cwd=$PWD";
        __wsh_emit "133;A";
      };
      autoload -Uz add-zsh-hook;
      add-zsh-hook preexec __wsh_pre;
      add-zsh-hook precmd __wsh_post;
    fi
    

    觉得别扭的可以在设置里进行全局关闭,或者在服务器编辑页面也可以关闭

    以上举例的这些操作都是会话标签级别的,大幅提升了操作效率


    提一点我觉得很 OK 的功能,那就是<离开安全提醒>!真的有用!

    比如我开了多个 SSH 会话,其中有测试环境的、有生产环境的、有其他巴拉巴拉的

    然后我在某个服务器下操作了一段时间后切其他软件工作了,这时候我在其他软件工作一段时间后再切回 WinSSH 的时候,如果不注意就直接操作可能会误操作服务器(就是忘了)

    那么这时候,WinSSH 就会有一个覆盖整个软件的提醒,告知你当前激活的标签是哪台服务器

    安全提醒

    好用!这个提醒可以在设置里面开关设置离开时长阈值


    然后是数据隐私问题,WinSSH 全面开源,没有任何上报服务器的行为!

    支持自动备份和 webDAV 数据同步,喜欢完 NAS 的朋友应该很赞同这个功能~哈哈

    1780624741364.png


    其他的就是一些常规功能了,大家可以去探索一下

    最后

    Github: https://github.com/lantongxue/winssh

    唯一官网: https://winssh.net

    想不到吧,我又把域名买回来了(吐槽:net 域名贵了好多,新购 90 ,续费 95 )

    大佬们 Star 走起来!!!

    16 replies    2026-06-05 23:03:35 +08:00
    psllll
        1
    psllll  
       22h 45m ago
    ;浏览器+1
    lieyan
        2
    lieyan  
    OP
       22h 40m ago
    @psllll 不能这样考虑,就目前来说,低成本跨平台桌面客户端开发 electron 依然是首选
    evilHa
        3
    evilHa  
       22h 24m ago
    嗯,很好,参考一下 termark ,加入 AI 功能是王道,这个时代就是工具全部+AI 重构。
    handsome198311
        4
    handsome198311  
       22h 22m ago
    试了一下,不错哦。能不能加上串口连接功能呢
    lieyan
        5
    lieyan  
    OP
       22h 1m ago
    @handsome198311 暂时先专注 SSH 这块,早期是考虑了串口的
    @evilHa 暂时不考虑加入 AI 功能,只想让工具纯粹
    asd1314s
        6
    asd1314s  
       20h 5m ago
    重量级,真的是重量级
    ShineyWang
        7
    ShineyWang  
       19h 21m ago
    SSH 客户端我需要的一个功能是 可以自定义输出格式

    比如我通过命令执行的 SQL 语句结果;要可以用 `visidata` 这样的外部工具 过滤筛选结果

    这是方便堡垒机查询数据库用的,我还没见过哪个 SSH 客户端有这个功能
    teavevenne
        8
    teavevenne  
       19h 2m ago
    可以复制粘贴文件传输嘛?
    deepseek
        9
    deepseek  
       18h 58m ago
    下载试用中, 关于字体大小, 建议加两种快捷方式, ctrl+鼠标滚轮上下, 和 ctrl 和+/-/0 键盘, 这样就可以实时修改
    lieyan
        10
    lieyan  
    OP
       18h 19m ago
    @deepseek 这个功能正在规划
    @teavevenne 暂时还不支持
    w6a
        11
    w6a  
       16h 58m ago
    文件目录无法跟随命令行,这是很痛的痛点
    lieyan
        12
    lieyan  
    OP
       15h 32m ago
    @w6a 这个功能早期做了一版,不是很理想,下一版会加上去
    tcp
        13
    tcp  
       12h 54m ago
    讲讲域名的故事呗,之前弄丢了吗?
    zrlhk
        14
    zrlhk  
       10h 44m ago
    虽然你是 ssh ,我还是要说,没有 rdp 的终端 我不会用的
    lieyan
        15
    lieyan  
    OP
       9h 54m ago
    @tcp 哈哈,也没什么故事,就是早期我有做 WinSSH 想法的时候我就买了这个域名,然后不是鸽了吗,域名也就没续费了,直到现在才买回来
    lieyan
        16
    lieyan  
    OP
       9h 54m ago
    @zrlhk 后面再考虑
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2573 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 00:58 · PVG 08:58 · LAX 17:58 · JFK 20:58
    ♥ Do have faith in what you're doing.