
本文主要用于記錄在Windows上使用WSL2和centos系統(tǒng)打造一個(gè)免費(fèi)高效的shell終端的配置過程以及界面優(yōu)化過程。
1、選型分析
之前一直都是使用termius和windows來進(jìn)行ssh管理,但是最近termius要過期了(沒錢續(xù)費(fèi)),不用盜版(版權(quán)意識(shí)),ssh的Agent Forwarding功能是個(gè)人剛需且為termius的付費(fèi)版才有的功能,所以開始研究windows上免費(fèi)的ssh客戶端管理工具或者是方式。
(mac系統(tǒng)用戶可以跳過這篇文章)首先考慮到了mac,因?yàn)閙ac系統(tǒng)是類unix系統(tǒng),在命令行終端操作上要比windows好太多,但是沒錢買mac,所以pass
然后如果直接使用linux系統(tǒng)的話雖然shell的問題很容易解決,但是其他的辦公軟件無法使用或者很難用;如果用虛擬機(jī)跑linux,啟動(dòng)麻煩,耗費(fèi)性能,文件管理也十分麻煩;所以pass
還有就是各種windows上的各種免費(fèi)第三方工具,如powershell、GitBash、cmder等等,能實(shí)現(xiàn)一定的Linux命令和shell功能,但是相比原生linux還是功能殘缺。
但是如果只要管理各種ssh客戶端的話很多免費(fèi)工具已經(jīng)足夠優(yōu)秀了,而筆者本次除了管理ssh之外還想要實(shí)現(xiàn)一定的shell功能,因此最后鎖定Windows10上面的2004版本的wsl2工具,用它來運(yùn)行一個(gè)linux系統(tǒng),雖然是殘缺的Linux,但是在shell功能和ssh功能上和直接運(yùn)行Linux并無差異。唯一需要注意的就是windows的版本要比較新。

WSL 2 is only available in Windows 10 builds 18917 or higher
2、安裝wsl
windows官網(wǎng)的安裝教程比較詳細(xì),并且wsl的安裝啟用比較簡(jiǎn)單,我們可以直接使用管理員模式的powershell通過命令行來啟用:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
命令順利執(zhí)行完后需要重啟,這時(shí)候輸入wsl --help就可以看到wsl已經(jīng)安裝成功。
3、安裝centos
Windows的應(yīng)用商店中有一些不錯(cuò)的linux發(fā)行版,包括很多同學(xué)都很喜歡的ubuntu,但是個(gè)人比較熟悉使用centos,而應(yīng)用商店中的centos是要收費(fèi)的,不過好在github上面有CENTOS官方開源的安裝包,我們這里使用github上的安裝包進(jìn)行安裝。
如果使用應(yīng)用商店中的發(fā)行版直接點(diǎn)擊安裝即可。隨后便可以跳過下面的centos的安裝部分。
首先我們?nèi)?a target="_blank">centos的GitHub頁面下載對(duì)應(yīng)的安裝包:

注意這里要切換分支進(jìn)行下載,以centos7-x86.64為例,這里對(duì)應(yīng)的就是最新的centos7.8系統(tǒng),我們只需要下載對(duì)應(yīng)的tar.xz壓縮包即可。
wget https://github.com/CentOS/sig-cloud-instance-images/blob/CentOS-7-x86_64/docker/centos-7-x86_64-docker.tar.xz

接著我們以管理員身份打開一個(gè)powershell窗口:
# 安裝 Chocolatey
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
# 安裝 LxRunOffline
choco install lxrunoffline
注意這里安裝完成之后需要重啟powershell來進(jìn)行下一步的安裝
LxRunOffline install -n 自定義系統(tǒng)名稱 -d 安裝目錄路徑 -f tar.xz安裝包路徑
# 注意windows系統(tǒng)命令行中的文件路徑和linux系統(tǒng)差別很大
# 比如我這里的安裝命令就是
LxRunOffline.exe install -n centos -d D:/centos -f .\centos-7-x86_64-docker.tar.xz
# 將centos安裝到D盤的centos文件夾下,并且命名為centos
接下來就可以使用下述兩種方式嘗試啟動(dòng)
LxRunOffline run -n 自定義系統(tǒng)名稱
wsl -d 自定義系統(tǒng)名稱

4、升級(jí)centos為wsl2
# 列出已經(jīng)安裝的wsl的信息
wsl -l -v
# 將對(duì)應(yīng)的wsl設(shè)為wsl2,注意<Distro>要和上面查詢到的信息一致
wsl --set-version <Distro> 2
# 設(shè)置默認(rèn)使用的發(fā)行版
wsl -s <Distro>

5、配置windows terminal
使用windows的cmd或者powershell都可以直接輸入wsl命令進(jìn)入到wsl系統(tǒng)中進(jìn)行操作,但是由于這兩者的界面比較丑,因此我們這里使用可以定制更多參數(shù)的windows terminal來進(jìn)行替換。
不過windows terminal目前來說屬于比較輕量級(jí)的產(chǎn)品,如果需要更多的功能可以考慮一下其他的軟件,這里額外推薦一個(gè)免費(fèi)的全平臺(tái)終端terminus,注意比收費(fèi)的termius要多一個(gè)字母n,也是github上面的一個(gè)開源項(xiàng)目,免費(fèi)高效且內(nèi)置多種主題和少量還可以的插件。
5.1 安裝windows terminal
windows terminal直接使用win10自帶的應(yīng)用商店即可搜索下載安裝。
5.2 安裝powerline/fonts
powerline/fonts是github上面的一個(gè)項(xiàng)目,涵蓋了較多的字體,windows本身內(nèi)置的字體可能在shell中顯示不太美觀,所以這里我們需要在windows系統(tǒng)中和wsl中都安裝字體。
首先在wsl中使用git拉取項(xiàng)目并且安裝
git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh
在Windows中也需要安裝該字體,以UbuntuMono為例,同樣是下載之后進(jìn)入到對(duì)應(yīng)的文件夾中手動(dòng)安裝所有的ttf字體即可:

(注意盡量以管理員身份為本機(jī)所有用戶安裝)

5.3 配置iTerm2-Color-Schemes
主題的效果我們可以在官網(wǎng)進(jìn)行預(yù)覽,配置參數(shù)我們可以在對(duì)應(yīng)的GitHub中找到。需要注意的是要找到對(duì)應(yīng)的windows terminal目錄中的配置。
5.4 配置setting.json
setting.json的參數(shù)非常多,我們可以根據(jù)自己的習(xí)慣設(shè)定顯示界面和快捷鍵等操作,并且還可以添加背景圖片,自定義不同shell的圖標(biāo)icon和主題等用以區(qū)分不同的shell避免誤操作。
// 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}", //設(shè)定默認(rèn)啟動(dòng)使用的shell。這里使用后面對(duì)應(yīng)的guid
"initialRows": 40, //初始化窗口的行數(shù)
"initialCols": 150,//初始化窗口的列數(shù)
"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": [//這里可以設(shè)置快捷鍵
{
"command" : "copy",
"keys" :
[
"ctrl+c"
]
},
{
"command" : "paste",
"keys" :
[
"ctrl+v"
]
}
]
}
5.5 ssh_config
最后我們?cè)俅钆鋝sh自帶的ssh_config來添加各種自定義ssh參數(shù),如果需要在這上面開啟ssh的Agent Forwarding功能,個(gè)人習(xí)慣是單獨(dú)創(chuàng)建一個(gè)腳本并且在bash中設(shè)置alias快捷操作。
# 腳本內(nèi)容示例
# 開啟ssh Agent Forwarding
eval `ssh-agent`
# 將要使用的ssh key添加到ssh-add中
# 如果后面不指明文件則使用默認(rèn)的~/.ssh/id_rsa
# 也可以一次添加多個(gè)
ssh-add ~/.ssh/id_rsa
ssh user@host
然后在bashrc文件中添加alias即可快速操作,對(duì)應(yīng)的ssh_config參數(shù)可以使用man ssh_config命令來查看。
這里貼出幾個(gè)常用的參數(shù):
Host example.host.com
# ssh遠(yuǎn)程客戶端的別名,可以直接通過ssh example.host.com來進(jìn)行連接
HostName 192.168.1.1
# ssh遠(yuǎn)程客戶端的ip地址
User root
# ssh遠(yuǎn)程的用戶
Port 22
# ssh的端口
IdentityFile ~/.ssh/id_rsa
# ssh的認(rèn)證密鑰
ForwardAgent yes
# 是否開啟Agent Forwarding,默認(rèn)不開啟
AddKeysToAgent yes
# 是否自動(dòng)將 key 加入到 ssh-agent,值可以為 no(default)/confirm/ask/yes
# 如果是 yes,key 和密碼都將讀取文件并以加入到 agent ,就像 ssh-add。其他分別是詢問、確認(rèn)、不加入的意思。添加到 ssh-agent 意味著將私鑰和密碼交給它管理,讓它來進(jìn)行身份認(rèn)證。
6、效果展示
wsl2使用的應(yīng)該是windows定制的內(nèi)核(目前我的系統(tǒng)內(nèi)核是4.19.84-microsoft-standard),同時(shí)無法使用systemd工具,但是作為terminal來使用已經(jīng)是綽綽有余了,命令的豐富程度也要遠(yuǎn)勝于powershell、gitbash和其他的第三方命令行,安裝一些常用命令的方便程度也要遠(yuǎn)勝于cygwin等。windows系統(tǒng)的硬盤也會(huì)直接掛載在wsl中的/mnt目錄下,可以直接使用Linux的sed、awk、paste等命令來對(duì)windows下的文本進(jìn)行操作。

注意在默認(rèn)情況下會(huì)把系統(tǒng)本身的硬盤也掛載到
/mnt目錄下,注意不要誤操作rm命令