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

造了个启动 WSL 里的 sshd 的小东西

  •  
  •   RedL0tus · 2019-06-02 19:38:42 +08:00 · 4701 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为一些不可抗的原因,我这段时间在用 Windows。但是在这之前我已经有半年左右没用过 Windows 了,离开了 Linux 下的那些工具可以说是浑身难受。而且最近这段时间刚刚配了一下 tmux 之类的东西感觉挺好。到了 Windows 下可真算是这也没有那也没有了。

    于是装了 openSUSE 和 Arch 两个 WSL(Windows Subsystem Linux) 发行版。装完并设置好自己的 dotfiles 之后用了一段时间才发现 Windows 下根本就没一个好用的终端模拟器:

    • Windows 版的 Alacritty 字符显示不正确,拉伸窗口之后 tmux 的 status line 显示不正常。
    • Fluent Terminal 虽然好看,字符也正常,但是换行多了之后 tmux 的 status line 会丢。
    • ConEmu 对 dialog 的支持好像有问题。

    并且 vim 在这些终端模拟器里基本就是不能使用(尤其是配色上面)。这些问题据说是 ConHost 的限制,他们做终端模拟器的人也没办法。

    前段时间巨硬的 Build 大会上公布了 Windows Terminal,我也去他们的 CI 上面下了一个 Dev 构建然后试了下,发现:

    • 部分地方的颜色还是不对。
    • 功能倒是没什么大问题了,但是不支持 tmux 的 mouse mode 等等。
    • 占用真的太太太太太太高了,性能也是真的很烂... 我开了 五六个标签页吃了我 3GB+ 的内存和 20+% 的 CPU,Antimalware 的那个服务在此之上又吃了 20+% 的 CPU... 我这还什么都没干呢。而且这个时候性能已经差到了能看到它一个字一个字打出来的程度,实在是遭不住。

    这时候又看到说我们可以用 SSH,毕竟 Windows 下还是有不少还算好用的 SSH 客户端的嘛。可是这个方法也不是很完美。一是 WSL 里没有真正意义上的 init,像 Arch 这样只有纯 systemd 的发行版无法通过它自动启动 sshd ;二是就算能用 RC 脚本启动 sshd (比如 Ubuntu ),也还是需要用户操作,相对麻烦。

    然后我就想造一个东西能启动 WSL 里面的 sshd,网上稍微搜了下好像也没有同类程序。我就自己下载了 Visual Studio 试着写了一个。

    截图

    其实本来想做成 UWP 的但是试了一下发现完全没头绪,最后用了 WPF。我总共就没做过几个图形程序,希望大佬们轻点。

    现在基本功能在我这边测试是能用了(可以列出发行版,可以启动 sshd,可以开机自动启动),但是还是很不完善:

    • 窗口现在是无法拖大小的,因为我做不来。
    • 现在无法只停止 sshd 服务,只能杀死所有同个发行版的 WSL instance:
      • 我现在把跑了 sshd 的 WSL 进程放进了 BackgroundWorker,但是不知道如何正确结束掉 BackgroundWorker 里面的子进程。
      • 同时由于 WSL instance 之间是独立的,我无法通过再创建一个 WSL 进程来杀死之前的 sshd。
      • 所以最后发现我只能把它做成杀死所有 WSL instance,当然主要是我太菜。
    • 现在的 Logo 很丑,我也没办法,毕竟我不懂设计。
    • 缺少 Error handling。

    但是它至少能用了嘛!

    源码: https://github.com/RedL0tus/WSL_SSH_Launcher

    第 1 条附言  ·  2019-06-06 10:16:14 +08:00

    上架到了巨硬商店,贪心设了 0.99 刀的价格。提供无限免费试用,就把这个收费当捐赠吧(小声

    链接: https://www.microsoft.com/store/apps/9NRPB1HPKK8G

    21 条回复    2019-07-13 14:38:46 +08:00
    EricXuu
        1
    EricXuu  
       2019-06-02 19:49:57 +08:00 via Android
    好厉害!但是加个计划任务不就好了。。
    详细可以参考
    我爱命令行 - WSL 服务自动启动的正确方法
    https://zhuanlan.zhihu.com/p/47733615
    goreliu
        2
    goreliu  
       2019-06-02 19:52:12 +08:00 via Android
    可以试试 wsltty,颜色、鼠标、vim 和 tmux 支持都正常,本地使用的话没太大必要用 ssh。另外把 wsl 的路径从防病毒软件扫描路径排除就没有 Antimalware cpu 占用了。
    RedL0tus
        3
    RedL0tus  
    OP
       2019-06-02 19:53:17 +08:00
    @EricXuu 看了下,这还是需要一个手动启动 WSL 的过程吧,我比较懒(小声
    RedL0tus
        4
    RedL0tus  
    OP
       2019-06-02 20:00:18 +08:00
    @goreliu 刚试了一下,颜色还是不对 😂
    这个是 ConHost 的问题的样子,没办法的吧 😂

    等 Windows Terminal 正式发布的时候我这东西应该就可以退休了(小声
    lhx2008
        5
    lhx2008  
       2019-06-02 20:04:28 +08:00
    不错,wsl 里面的 ubuntu 好像用 service sshd start 就可以,就是自启动还要写一个脚本

    我要用 Docker, 还是虚拟机 + SSH 省心。WSL 就配合 Clion 编译下程序
    iyaozhen
        6
    iyaozhen  
       2019-06-02 20:31:14 +08:00
    我是写了个 run_wsl.vbs ,防止启动文件夹下
    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/service ssh restart'",0

    《 Windows 10 生产力提升之 WSL 实践》 https://iyaozhen.com/windows10-wsl-ubuntu.html

    “现在无法只停止 sshd 服务,只能杀死所有同个发行版的 WSL instance ” 不知道有没有记错,好像现在版本 WSL 只启动一个实例,直接 ssh 上去然后 sudo service ssh stop ?
    RedL0tus
        7
    RedL0tus  
    OP
       2019-06-02 20:40:25 +08:00
    @iyaozhen 我是用 Arch WSL 测试的,它没有 RC 脚本所以用不了 service ;程序里启动在前台的 sshd 再启动一个 WSL 进程就看不到了,应该是隔离到了另一个 instance 里,所以我现在是这么做的... 我这里是 1903,具体我也不清楚了。
    Nasei
        8
    Nasei  
       2019-06-02 21:38:13 +08:00 via Android
    @RedL0tus 是说开两个窗口的话,一个窗口中进程,另外一个没办法通过 ps - a 之类的看到吗?
    RedL0tus
        9
    RedL0tus  
    OP
       2019-06-02 21:51:24 +08:00
    @Nasei 至少我测试出来是这样的 😂
    都是独立的 WSL instance,ps 列不出别的 instance 的进程自然也无法操作(
    Himingway
        10
    Himingway  
       2019-06-02 23:38:17 +08:00


    好像能 kill 掉
    mxalbert1996
        11
    mxalbert1996  
       2019-06-02 23:46:23 +08:00 via Android
    wsl-terminal 试过了吗?
    NSAgold
        12
    NSAgold  
       2019-06-03 02:18:43 +08:00 via Android
    @RedL0tus #3 楼上#1 那个应该不用手动启动 wsl 了。因为用 vbs 脚本启动了。
    也可以把 vbs 的快捷方式拖进开始菜单的启动文件夹里(藏挺深,和 wsl 的目录差不多深)
    (我之前做法也是写了个 vbs 脚本无窗口启动 不过是调用 bash 启动 wsl 里的其他程序。)
    glouhao
        13
    glouhao  
       2019-06-03 07:41:48 +08:00 via Android
    搭车问下 学习 python 爬虫,放 wsl 里效率咋样,比直接放 win10 如何?
    RedL0tus
        14
    RedL0tus  
    OP
       2019-06-03 10:54:22 +08:00
    @Himingway 诶... 我这里之前测试的时候不行... 现在突然又行了 🤣
    RedL0tus
        15
    RedL0tus  
    OP
       2019-06-03 10:55:33 +08:00
    @NSAgold 嘛... 我写都写出来了(
    lqh0126
        16
    lqh0126  
       2019-06-03 15:40:46 +08:00
    楼主试一下 VSCode 里的 Terminal ?
    RedL0tus
        17
    RedL0tus  
    OP
       2019-06-04 09:30:57 +08:00
    @lqh0126 那个在 Linux 下都不是很好用...
    BUYI
        18
    BUYI  
       2019-06-05 17:25:17 +08:00
    Moba xterm 可以直接打开 WSL 终端(当然它也可以打开 cmd.exe powershell 等等) Session 管理也很好
    RedL0tus
        19
    RedL0tus  
    OP
       2019-06-06 10:18:44 +08:00
    @BUYI 免费的限制 tab 数量啊... 专业版有点贵。我已经卖了 Token2Shell 了非常心疼钱 🤣🤣🤣
    RedL0tus
        20
    RedL0tus  
    OP
       2019-06-06 10:18:59 +08:00
    @RedL0tus 已经买了*
    BUYI
        21
    BUYI  
       2019-07-13 14:38:46 +08:00
    @RedL0tus 它的 Home Edition ( free )并没有 tab 数量的限制
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2724 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:30 · PVG 22:30 · LAX 06:30 · JFK 09:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.