Windows Terminal + WSL2 + CENTOS 配置Windows命令终端

本文最后更新于:May 12, 2020 am

本文主要用于记录在Windows上使用WSL2和centos系统打造一个免费高效的shell终端的配置过程以及界面优化过程。

1、选型分析

之前一直都是使用termius和windows来进行ssh管理,但是最近termius要过期了(没钱续费),不用盗版(版权意识),ssh的Agent Forwarding功能是个人刚需且为termius的付费版才有的功能,所以开始研究windows上免费的ssh客户端管理工具或者是方式。

(mac系统用户可以跳过这篇文章)首先考虑到了mac,因为mac系统是类unix系统,在命令行终端操作上要比windows好太多,但是没钱买mac,所以pass

然后如果直接使用linux系统的话虽然shell的问题很容易解决,但是其他的办公软件无法使用或者很难用;如果用虚拟机跑linux,启动麻烦,耗费性能,文件管理也十分麻烦;所以pass

还有就是各种windows上的各种免费第三方工具,如powershell、GitBash、cmder等等,能实现一定的Linux命令和shell功能,但是相比原生linux还是功能残缺。

但是如果只要管理各种ssh客户端的话很多免费工具已经足够优秀了,而笔者本次除了管理ssh之外还想要实现一定的shell功能,因此最后锁定Windows10上面的2004版本的wsl2工具,用它来运行一个linux系统,虽然是残缺的Linux,但是在shell功能和ssh功能上和直接运行Linux并无差异。唯一需要注意的就是windows的版本要比较新。

WSL 2 is only available in Windows 10 builds 18917 or higher

2、安装wsl

windows官网的安装教程比较详细,并且wsl的安装启用比较简单,我们可以直接使用管理员模式的powershell通过命令行来启用:

1
2
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

命令顺利执行完后需要重启,这时候输入wsl --help就可以看到wsl已经安装成功。

3、安装centos

Windows的应用商店中有一些不错的linux发行版,包括很多同学都很喜欢的ubuntu,但是个人比较熟悉使用centos,而应用商店中的centos是要收费的,不过好在github上面有CENTOS官方开源的安装包,我们这里使用github上的安装包进行安装。

如果使用应用商店中的发行版直接点击安装即可。随后便可以跳过下面的centos的安装部分。

首先我们去centos的GitHub页面下载对应的安装包:

注意这里要切换分支进行下载,以centos7-x86.64为例,这里对应的就是最新的centos7.8系统,我们只需要下载对应的tar.xz压缩包即可。

1
wget https://github.com/CentOS/sig-cloud-instance-images/blob/CentOS-7-x86_64/docker/centos-7-x86_64-docker.tar.xz

接着我们以管理员身份打开一个powershell窗口:

1
2
3
4
# 安装 Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
# 安装 LxRunOffline
choco install lxrunoffline

注意这里安装完成之后需要重启powershell来进行下一步的安装

1
2
3
4
5
LxRunOffline install -n 自定义系统名称 -d 安装目录路径 -f tar.xz安装包路径
# 注意windows系统命令行中的文件路径和linux系统差别很大
# 比如我这里的安装命令就是
LxRunOffline.exe install -n centos -d D:/centos -f .\centos-7-x86_64-docker.tar.xz
# 将centos安装到D盘的centos文件夹下,并且命名为centos

接下来就可以使用下述两种方式尝试启动

1
2
LxRunOffline run -n 自定义系统名称
wsl -d 自定义系统名称

4、升级centos为wsl2

windows官网教程

1
2
3
4
5
6
# 列出已经安装的wsl的信息
wsl -l -v
# 将对应的wsl设为wsl2,注意<Distro>要和上面查询到的信息一致
wsl --set-version <Distro> 2
# 设置默认使用的发行版
wsl -s <Distro>

5、配置windows terminal

使用windows的cmd或者powershell都可以直接输入wsl命令进入到wsl系统中进行操作,但是由于这两者的界面比较丑,因此我们这里使用可以定制更多参数的windows terminal来进行替换。

不过windows terminal目前来说属于比较轻量级的产品,如果需要更多的功能可以考虑一下其他的软件,这里额外推荐一个免费的全平台终端terminus注意比收费的termius要多一个字母n,也是github上面的一个开源项目,免费高效且内置多种主题和少量还可以的插件。

5.1 安装windows terminal

windows terminal直接使用win10自带的应用商店即可搜索下载安装。

5.2 安装powerline/fonts

powerline/fonts是github上面的一个项目,涵盖了较多的字体,windows本身内置的字体可能在shell中显示不太美观,所以这里我们需要在windows系统中和wsl中都安装字体。

首先在wsl中使用git拉取项目并且安装

1
2
3
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh

在Windows中也需要安装该字体,以UbuntuMono为例,同样是下载之后进入到对应的文件夹中手动安装所有的ttf字体即可:

(注意尽量以管理员身份为本机所有用户安装)

5.3 配置iTerm2-Color-Schemes

主题的效果我们可以在官网进行预览,配置参数我们可以在对应的GitHub中找到。需要注意的是要找到对应的windows terminal目录中的配置。

5.4 配置setting.json

setting.json的参数非常多,我们可以根据自己的习惯设定显示界面和快捷键等操作,并且还可以添加背景图片,自定义不同shell的图标icon和主题等用以区分不同的shell避免误操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: https://aka.ms/terminal-documentation

{
"$schema": "https://aka.ms/terminal-profiles-schema",

"defaultProfile": "{aabae64a-7cf7-5add-b5d6-744e54ab56d6}", //设定默认启动使用的shell。这里使用后面对应的guid
"initialRows": 40, //初始化窗口的行数
"initialCols": 150,//初始化窗口的列数
"alwaysShowTabs": true,
"showTerminalTitleInTitlebar": true,

"profiles":
{
"defaults":
{
// Put settings here that you want to apply to all profiles
},
"list":
[
{
"guid": "{07b52e3e-de2c-5db4-bd2d-ba144ed6c273}",
"hidden": false,
"name": "Ubuntu-20.04",
"source": "Windows.Terminal.Wsl",
"fontFace": "Fira Mono for Powerline",
"fontSize": 12,
"colorScheme": "Ubuntu", //这里的color要和后面的schemes中的一致
"useAcrylic" : false, // 是否启用窗口透明度,效果类似毛玻璃特效
"acrylicOpacity" : 0.6 // 窗口透明度
}
{
"guid": "{aabae64a-7cf7-5add-b5d6-744e54ab56d6}",
"hidden": false,
"name": "centos",
"source": "Windows.Terminal.Wsl",
"fontFace": "Fira Mono for Powerline",
"fontSize": 12,
"colorScheme": "Atom",
"useAcrylic" : true, // 窗口透明度
"acrylicOpacity" : 0.8 // 窗口透明度
},
{
// Make changes here to the cmd.exe profile
"guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
"name": "cmd",
"commandline": "cmd.exe",
"hidden": false,
"fontSize": 12,
"colorScheme": "MaterialDark",
"useAcrylic" : false, // 窗口透明度
"acrylicOpacity" : 0.5 // 窗口透明度
}
]
},

// Add custom color schemes to this array
"schemes": [
{
"name": "Atom",
"black": "#000000",
"red": "#fd5ff1",
"green": "#87c38a",
"yellow": "#ffd7b1",
"blue": "#85befd",
"purple": "#b9b6fc",
"cyan": "#85befd",
"white": "#e0e0e0",
"brightBlack": "#000000",
"brightRed": "#fd5ff1",
"brightGreen": "#94fa36",
"brightYellow": "#f5ffa8",
"brightBlue": "#96cbfe",
"brightPurple": "#b9b6fc",
"brightCyan": "#85befd",
"brightWhite": "#e0e0e0",
"background": "#161719",
"foreground": "#c5c8c6"
}
],
"keybindings": [//这里可以设置快捷键
{
"command" : "copy",
"keys" :
[
"ctrl+c"
]
},
{
"command" : "paste",
"keys" :
[
"ctrl+v"
]
}
]
}


5.5 ssh_config

最后我们再搭配ssh自带的ssh_config来添加各种自定义ssh参数,如果需要在这上面开启ssh的Agent Forwarding功能,个人习惯是单独创建一个脚本并且在bash中设置alias快捷操作。

1
2
3
4
5
6
7
8
# 脚本内容示例
# 开启ssh Agent Forwarding
eval `ssh-agent`
# 将要使用的ssh key添加到ssh-add中
# 如果后面不指明文件则使用默认的~/.ssh/id_rsa
# 也可以一次添加多个
ssh-add ~/.ssh/id_rsa
ssh user@host

然后在bashrc文件中添加alias即可快速操作,对应的ssh_config参数可以使用man ssh_config命令来查看。

这里贴出几个常用的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Host example.host.com
# ssh远程客户端的别名,可以直接通过ssh example.host.com来进行连接
HostName 192.168.1.1
# ssh远程客户端的ip地址
User root
# ssh远程的用户
Port 22
# ssh的端口
IdentityFile ~/.ssh/id_rsa
# ssh的认证密钥
ForwardAgent yes
# 是否开启Agent Forwarding,默认不开启
AddKeysToAgent yes
# 是否自动将 key 加入到 ssh-agent,值可以为 no(default)/confirm/ask/yes
# 如果是 yes,key 和密码都将读取文件并以加入到 agent ,就像 ssh-add。其他分别是询问、确认、不加入的意思。添加到 ssh-agent 意味着将私钥和密码交给它管理,让它来进行身份认证。

6、效果展示

wsl2使用的应该是windows定制的内核(目前我的系统内核是4.19.84-microsoft-standard),同时无法使用systemd工具,但是作为terminal来使用已经是绰绰有余了,命令的丰富程度也要远胜于powershell、gitbash和其他的第三方命令行,安装一些常用命令的方便程度也要远胜于cygwin等。windows系统的硬盘也会直接挂载在wsl中的/mnt目录下,可以直接使用Linux的sed、awk、paste等命令来对windows下的文本进行操作。

注意在默认情况下会把系统本身的硬盘也挂载到/mnt目录下,注意不要误操作rm命令