# 其他工具

🍊 本文内容

本文将对 WSL 上常用命令、常见工具、常见使用场景等内容进行介绍和说明。接下来的内容为了方便介绍,我将以 zsh 为 WSL 的默认 Shell 进行讲述。

# WSL 2 中的网络访问问题 WSL 2

🚨 使用 WSL 2 时需注意的 IP 地址问题

由于 WSL 2 实际上是一个 Linux 内核运行在 Hyper-V 虚拟机中,因此 WSL 2 目前并不能和 Windows 共享 localhost(也就是下文中涉及到的 127.0.0.1)。以下内容仅适用于 WSL 2 环境。

目前,WSL 2 在和本机 Windows 互相访问的时候,有时候需要我们手动使用 WSL 虚拟机映射出来的 IP 地址才能正确进行代理配置、网络访问等。因此,如果你正在使用 WSL 2 环境进行开发工作,下面的配置中的所有 127.0.0.1 都可能需要置换为 WSL 2 的 IP 地址。

你可以使用下面的命令来找到当前 WSL 2 的 IP 地址:

来自:WSL2 的一些网络访问问题 - 获取主机的 IP

ip route | grep default | awk '{print $3}'
# 或者
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

# 代理配置

使用下面的命令将当前 session(会话)的代理进行配置:

set http_proxy=http://127.0.0.1:{端口号}
set https_proxy=http://127.0.0.1:{端口号}

使用下面的命令取消代理,使用系统代理:

unset http_proxy https_proxy

可以使用下面的命令检测自己的对外端口:

# 一个接口
curl ipinfo.io

# 另一个接口
curl cip.cc

上面的命令可以通过 alias(别名)加入 ~/.zshrc 中,方便快速输入。在 ~/.zshrc 中添加如下内容:

# 出去
alias fuckgfw="set http_proxy=http://127.0.0.1:{端口号} && set https_proxy=http://127.0.0.1:{端口号}"
# 回来
alias unfuckgfw="unset http_proxy https_proxy"
# 测试 IP
alias myip="curl cip.cc"

然后执行 source ~/.zshrc 加载配置文件。

# 版本控制

Git 是目前版本控制工具的典范、代表,如果你使用 GitHub,那么我相信你已经非常了解 Git 及其使用原理和方法了。

使用 Ubuntu 的 apt 安装 Git:

sudo apt install git

配置 Git 使用代理:

git config --global http.proxy 'http://127.0.0.1:{端口号}'
git config --global https.proxy 'https://127.0.0.1:{端口号}'

取消 Git 代理:

git config --global --unset http.proxy
git config --global --unset https.proxy

为了方便使用,可以将上面两个命令设置为 alias,即别名。在 ~/.zshrc 中添加如下内容:

alias fuckgit="git config --global http.proxy 'socks5://127.0.0.1:1080' && git config --global https.proxy 'socks5://127.0.0.1:1080'"
alias unfuckgit="git config --global --unset http.proxy && git config --global --unset https.proxy"

然后执行 source ~/.zshrc 加载配置文件。

# 远程登录

# ssh

ssh — Secure Shell 工具是与远程服务器沟通的渠道。我们不仅可以使用 ssh 登录远程服务器,还可以利用 ssh 在不输入 GitHub 账户密码的情况下将 Git 仓库内容推送至 GitHub 远程仓库。

# ssh 登录 GitHub

下面配置与 GitHub 连接的 SSH 密钥:[1]

  • 在 WSL 下生成 SSH 公钥 — 私钥对(将邮箱替换为你的邮箱),此时生成的 SSH 密钥默认位于 ~/.ssh 路径下,公钥为 id_rsa.pub,私钥为 id_rsa
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • 打开 ssh-agent 使之在后台运行:
eval "$(ssh-agent -s)"
  • 将私钥添加到 ssh-agent 之中:
ssh-add ~/.ssh/id_rsa
  • 查看公钥并将之复制到剪贴板:
# 查看公钥内容
cat ~/.ssh/id_rsa.pub

# 将公钥复制到剪贴板
cat ~/.ssh/id_rsa.pub | clip.exe
  • 将复制好的公钥添加到 GitHub 账户密钥里面[2]

# ssh 登录远程服务器

一般远程服务器都会为你提供上传 SSH 密钥的功能,或者提供生成 SSH 密钥对供你下载使用的功能。这里以阿里云服务器为例子,阿里云为我提供了一个 .pem 的密钥,这一密钥就是我们的「私钥」,在执行 ssh 登录的时候,我们将以命令行参数的形式用「密钥」进行身份认证:

  • 一般情况下,我们会将 SSH 密钥(公钥和私钥)存储在 ~/.ssh 目录下。为了安全且符合 ssh 工具标准,我们需要为密钥先赋予正确的权限:
# 赋予只读权限
sudo chmod 400 ~/.ssh/{SSH_KEY_FILENAME}.pem
  • 之后,登录服务器就只需要执行类似下面的命令:
# 以 {USERNAME} 的身份登录地址(或 IP)位于 {HOST_IP_OR_URL} 的远程服务器
ssh -i ~/.ssh/{SSH_KEY_FILENAME}.pem {USERNAME}@{HOST_IP_OR_URL}

另外,我们可以配置将 Windows 侧和 WSL 2 的 SSH 密钥共享使用。详见:Sharing SSH keys between Windows and WSL 2 - Windows Command Line

# Mosh

Mosh 是新一代远程登录工具。Mosh 全新的「服务器 —— 客户端」沟通方式让我们客户端不再需要因为「延迟」或「切换网络」而需要重新登录服务器、重建 session,而丢失工作进度。Mosh 让远程服务器的连接能「持久化」,从而让我们能长时间、多网络保持同一个 session 不变。

🍧 注意

Windows 原生环境下没有 Mosh 的可安装、可执行版本,因此如果我们想使用最先进的远程登录技术 —— Mosh,或者我们需要安装 Chrome 版本的 Mosh,或者我们就需要使用 WSL。

在本机 WSL 环境下安装 Mosh:

sudo apt install mosh

ssh 登录远程服务器之后,在服务器上面同时安装 Mosh。我的服务器是 CentOS 7 系统,以 CentOS 为例:

sudo yum install mosh

由于 Mosh 在建立 SSH 连接之后,会使用 60000 - 61000 之间的某个端口,因此我们需要为服务器防火墙打开 60000 - 61000 端口的 UDP 转发服务:

sudo firewall-cmd --zone=public --permanent --add-port=60000-61000/udp

之后,我们在本机通过 Mosh 就可以直接登录远程服务器:

mosh {USERNAME}@{HOST_IP_OR_URL} --ssh="ssh -i ~/.ssh/{SSH_KEY_FILENAME}.pem"

# Windows 和 WSL 之间互相访问

Windows 和 WSL 相互配合的一大利好就是能够直接在 Linux 中执行 Windows 可执行文件(exe 文件),也可以反过来在 Windows 中执行 Linux 可执行文件。同时,WSL 2 的出现让我们能够直接在 Windows 的文件资源管理器中访问 Linux 文件系统,而不会像 WSL 1.0 一样对 Linux 中的文件造成无法逆转的影响。

# 文件系统

❗ 注意

WSL 2 架构允许我们通过 Plan 9 文件系统协议(9P protocol server)来从 Windows 侧访问 Linux 文件,与访问网络资源类似。这不意味着你可以直接通过 AppData 文件目录去访问 Linux 文件,如果你这样做,依旧会对 WSL 造成不可逆的影响。

在 WSL 环境中:

  • Windows 目录往往位于 /mnt/c/Users/{WINDOWS_USERNAME}
  • Linux 目录往往位于 /home/{WSL_USERNAME}

我们在 WSL 中可以通过下面的命令在文件资源管理器中打开 Linux 文件系统中的某个目录:

# 进入目标目录
cd /home/spencer

# 用 Windows 文件资源管理器打开目录
explorer.exe .

日后,为了方便我们直接访问 WSL 文件系统中的用户根目录,我们甚至可以直接将这一路径固定在「快速访问」中,完全没有任何问题。WSL 环境中的文件可以被 Windows 直接无障碍访问,用正常 Windows 应用程序打开,没有问题。

事实上,Windows 的 explorer.exe 命令能够将任意文件按照默认打开方式打开。也就是说,我们也可以直接在 WSL 中用 explorer.exe 打开图片、Markdown 文件、音频、视频等。比如,我们在 WSL 环境下进入 Linux 文件系统中的某个目录,希望用 Windows 的「照片」应用打开其中的一张 PNG 图片,那么我们可以直接:

explorer.exe {IMAGE_PATH}/{IMAGE_NAME}.png

# 命令执行

在 WSL 环境下执行 Windows 侧的命令非常直接易懂,就是在 Windows 命令后面加上可执行文件后缀 exe。比如:

  • 执行 explorer.exe 打开文件资源管理器,和上面的介绍类似
  • 工具 clip.exe 是 Windows 侧的剪贴板,我们可以将 WSL 侧的命令输出利用 clip.exe 导入 Windows 剪贴板。比如:
uname -r | clip.exe

在 Windows 侧(PowerShell 中)执行 WSL 的命令也同样相似,我们只需要在命令之前加上 wsl 即可。比如:

# 查看 WSL 内核版本
wsl uname -a

# 查看 WSL 发行版信息
wsl cat /etc/os-release

# 优化 WSL 2 虚拟磁盘占用空间

WSL 2 使用 VHDX 格式的虚拟磁盘储存文件,磁盘大小会在需要时自动扩容,长时间使用可能会占用较大的磁盘空间。我们可以通过 Optimize-VHD 命令来优化其占用空间。

该命令是 Hyper-V 功能的一部分,我们需要在 Windows 功能中启用 Hyper-V » Hyper-V 管理工具 » Windows PowerShell 的 Hyper-V 模块 以及 Hyper-V » Hyper-V 平台 » Hyper-V 服务

也可以参照开启「适用于 Linux 的 Windows 子系统」的附加功能一节,通过运行命令开启:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Management-PowerShell
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Services

然后以管理员权限执行 Optimize-VHD -Path <VHDX 文件路径> -Mode Full 即可。如果不清楚存储路径,可以打开注册表编辑器,在 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\{随机 GUID}\BasePath 下找到。

WSL 命令行方面的配置、工具、操作和问题异常处理等内容基本介绍完毕。接下来的一章,我们将对利用 Visual Studio Code 和 WSL 配合进行工作开发的内容进行介绍。


  1. Generating a new SSH key and adding it to the ssh-agent - GitHub Help ↩︎

  2. Adding a new SSH key to your GitHub account - GitHub Help ↩︎