Konsole on Windows (WSL)

Konsole的优点(vs XShell/Windows Terminal):

可以随意使用我习惯的 tmux 切 window/pane 快捷键: Shift+←→/Alt+↑↓←→ (XShell 中不可用)

开 tab 连 ssh 时, 能在 tab 上显示 ssh host, 便于区分

Tab title in Konsole
Tab title in Windows Terminal

没有以下奇怪问题

Windows Terminal 方块光标覆盖文字https://github.com/microsoft/terminal/issues/1203, 在 nvim 里仍然无效

复制完以后会取消选择 https://github.com/microsoft/terminal/issues/3884

python tqdm 中的进度条看起来正常(XShell 需要逐个将 属性-终端-将含糊的大小字符视为宽字符 的勾选去掉)

在 Windows 上安装使用 Konsole

基本思路是在 WSL(Windows Subsystem for Linux) 上跑 Konsole, 然后通过 X 转发, 在本地开一个 X Server 来显示 Konsole.

安装 WSL(Windows Subsystem for Linux)

我这里由于 Windows 10 没有 2004升级, 只能使用 WSL1, 直接在 Microsoft Store 里搜索发行版并安装即可. 由于我主要是用于 SSH, 基本与发行版无关, 就直接安装了 Ubuntu (会安装20.04 LTS).

安装配置一些常用软件, 比如 git zsh 等. oh-my-zsh 也可以直接安装上. 顺便安装一下 powerline 的字体 sudo apt install fonts-powerline

发现 htop 无法直接使用 https://github.com/microsoft/WSL/issues/25

安装 Konsole

直接用包管理器安装就好 sudo apt install konsole

配置 X 转发

我使用的 Windows X Server 是 vcxsrv. 安装完之后开始菜单里 XLaunch 一路默认启动即可.

执行 export DISPLAY=:0.0 即可, 添加到 .zshrc 方便使用.

ref: https://medium.com/@dhanar.santika/installing-wsl-with-gui-using-vcxsrv-6f307e96fac0

启动 Konsole

在 Ubuntu 里输入 konsole 并回车, 不出意外的话, Konsole 窗口就出现了.

图标丢失问题

此时应该会发现, 不少图标都丢失了. 比如 tab 的关闭按钮, 设置里左侧栏里的图标. 这应该没有安装提供这些图标的包导致的. 由于我还想用 Dolphin 等 KDE 软件, 我直接安装了 KDE 全家桶.

sudo apt install kde-full

安装完之后图标就正常了.

Dolphin 启动不起来

在 Ubuntu 里输入 dolphin 并回车, 提示

dolphin: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory

解决方法: 执行 sudo strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 即可

ref: https://superuser.com/questions/1347723/arch-on-wsl-libqt5core-so-5-not-found-despite-being-installed#comment2229452_1348051

鼠标指针被裁剪问题

此时会发现, 鼠标指针都被裁剪掉了一部分

cropped pointer cursor
cropped text cursor

似乎是老问题. 暂时没有解决, 通过缩小鼠标指针来提高体验.

执行 export XCURSOR_SIZE=32 即可, 也放进 .zshrc 方便使用. 修改为32后, 仍然有部分被裁剪掉了, 不过现在被裁剪的部分较少, 而且尺寸与我使用的 Windows 的鼠标指针大小基本相同, 姑且可以接受.

small pointer cursor
small text cursor

让 Konsole 更 Windows

此时打开 Konsole 的流程需要从开始菜单打开 Ubuntu, 输入 konsole 回车. 而 Ubuntu 的窗口还会开着. 这很不 Windows.

使用以下 vbs 脚本来启动 Konsole

Set oShell = CreateObject ("Wscript.Shell")
Dim strArgs
strArgs = "wsl zsh -c 'DISPLAY=localhost:0.0 XCURSOR_SIZE=32 konsole --workdir /home/epix'"
oShell.Run strArgs, 0, false

然后在 %AppData%\Microsoft\Windows\Start Menu 创建个快捷方式, 图标改成 Konsole 的图标, 就可以直接从开始菜单打开 Konsole 了.

ref: https://github.com/microsoft/WSL/issues/3404#issuecomment-408094942

仍然存在的问题

开启速度不如原生, 连接 ssh 时花费时间更多.

一些可能能够提高 SSH 体验的方法

将常用的 ssh 配置写入 .ssh/config 中, 用到时只要 ssh <Host字段> 即可.

使用 ssh-agent 来缓存解密的 ssh private key, 省去每次输入的麻烦, 方法

  1. 可以直接运行 eval `ssh-agent` 来启动 ssh-agent. 不能只运行 ssh-agent 的原因: ssh-agent 会把启动后需要执行的设置环境变量等信息输出, 需要 eval 后生效. ref: https://stackoverflow.com/questions/17846529/could-not-open-a-connection-to-your-authentication-agent/4086756#4086756
  2. 可以手动指定 ssh-agent 监听地址, 然后设置环境变量. 比如
    ssh-agent -a /run/shm/ssh-agent.sock export SSH_AUTH_SOCK=/run/shm/ssh-agent.sock

我使用的是方法2, 并将此内容写入 .zshrc, 每次进 zsh 都会尝试开 ssh-agent (已启动则会启动失败), 并设置环境变量.

ssh-agent 启动并设置好环境变量之后, 可以通过以下方法缓存

  1. 手动执行 ssh-add <path to private key> , 输入密码即可
  2. .ssh/config 中设置 AddKeysToAgent yes, 解密后加入 ssh-agent. 可以放到 Host * 下(对所有 Host 生效) 也可以放在某个 Host 下(只对此 Host 生效) ref:

我使用的是方法2, 每次开机后第一次连接需要输入密码, 之后只要 ssh-agent 存活就不需要再输入. (Konsole 窗口关闭后不会关闭 ssh-agent)

双重 X 转发

此时 Konsole 已经是通过 X 转发显示的了. 如果想要再将这里面 ssh 到的远程机器的 GUI 通过 X 转发回本地, 还需要一些额外设置.

  1. WSL 中安装 xauth
  2. .ssh/config中需要 X 转发的 Host 下添加
ForwardAgent yes
ForwardX11 yes
ForwardX11Trusted yes
XauthLocation /usr/bin/xauth

ref: https://unix.stackexchange.com/a/393766

Leave a Reply

Your email address will not be published. Required fields are marked *