Linux中國

玩轉 Windows 10 中的 Linux 子系統

在本文中,我會展示給你一些我認為非常有趣的功能,以及告訴你一些可以讓你找到更多信息的資源。首先,我會展示 WSL 所集成的那些主要命令(比如 ssh)是如何操作伺服器和設備的。其次,我會演示使用 Bash 腳本是如何以簡明的方式來自動化執行任務的。其三,我會利用極棒的命令行編譯器、一些其它工具以及對 *nix 兼容的能力來玩一個輕量級的古典黑客級遊戲: NetHack。最後,我會展示如何使用已有的 Python 腳本和其它來自網上的腳本。

從我的第一台 286 上運行的 Windows 3.0 開始,Windows 就一直是我的主要操作系統和開發環境。不過,我身邊也有很多 Linux 伺服器和設備。從樹莓派和路由器/網關設備這樣的物聯網設備,到 Minecraft 伺服器,它們堆滿了我的辦公室的每個角落。而我經常要從我的主工作站中去管理和配置這些 Linux 計算機。

管理伺服器和設備

我在我的家中運行著一台無顯示器的 Ubuntu Minecraft 伺服器,這是我去年給我十歲大的兒子的聖誕禮物,但是它已經變成了我的玩具而不是他的(好吧,主要是我的玩具)。我以前在我的 Windows 10 電腦上使用幾個客戶端來管理它,不過我現在想使用 Windows 中的 Bash 裡面的 ssh 命令行來管理它。使用類似 PuTTY 或來自 Cygwin 的 Tera Term 這樣的應用當然也可以,但是我想試試真正原生而自然的體驗也是一種不錯的選擇。Cygwin 就像是在披薩店訂購的披薩一樣,好吃,但是沒有那種氛圍。

我已經使用 WSL 中的 ssh-keygenssh-copy-id 設置好了公私密鑰對,所以使用 ssh 只需要如下簡單輸入即可:

$ ssh <username>@<server>

我還為此創建了一個別名,以便更快一些。這是一個標準的 Linux/Bash 功能:

$ alias mc=&apos;ssh <user>@<server>&apos;

現在,我要訪問我的 Minecraft 伺服器只需要在 Windows 10 下的 Bash 中輸入「mc」即可。

當然,同樣的方法你也可以用於任何 Linux 上的 Web 或資料庫伺服器上,甚至樹莓派或其它的物聯網設備也可以。

在終端裡面進行 ssh 只是為了方便而已,不過當你在 shell 中工作時,如果還有類似 apt、node、Ruby、Python 等等工具時,你就有了自動化各種工作的可能。

遠程腳本

假如說你有一大堆 Linux 伺服器和設備,而你要在它們上面執行一個遠程命令的話,如果已經配置好公私密鑰對,你就可以在 Bash 中直接遠程執行命令。

舉個例子說,想知道遠程伺服器自從上次重啟後已經運行了多長時間了,你只需要輸入:

$ ssh <user>@<server> &apos;last -x|grep reboot&apos;

ssh 會連接到該伺服器並執行 last -x 命令,然後搜索包含「reboot」的一行。我在我的 Ubuntu Minecraft 伺服器上運行的結果如下:

reboot   system boot  4.4.0-28-generic Thu Jul  7 08:14   still running

這只是一台伺服器,如果你有許多伺服器的話,你可以自動化這個過程。我在 WSL 里我的主目錄下創建了一個名為 servers.txt 的文件,它包含了一系列 Linux 伺服器/設備的名稱,每個一行。然後我就可以創建一個腳本來讀取這個文件。

在使用了很多年像樹莓派這樣的設備之後,我已經變成了一個 nano 人(在 VMS 上我是一個 LSEdit 人),下面是我用我喜愛的 nano 編輯器打開的腳本。

當然,你也可以使用 vim 、 emacs 或者其它可以用在 Ubuntu 終端上的編輯器。

該腳本是 Bash 腳本,要執行該腳本,輸入:

$ ./foreachserver.sh &apos;last -x|grep reboot&apos;

它將迭代輸出文件中的每個伺服器/設備,然後通過 ssh 遠程執行該命令。當然,這個例子非常簡單,但是你可以像這樣把你的本地腳本或其它命令變成遠程的。Bash 腳本語言足夠豐富,所以你可以使用它來完成你的大多數遠程管理任務。你可以用你下載到 WSL 或遠程系統中的其它應用來擴展它的使用。

你是否需要在工作中把本地的 Windows 文件或資源用於其它的 Linux 計算機嗎?或者,你根本不使用 Linux ?Bash 可以操作本地的 Windows 文件或資源,還是說它就是一個完全獨立的環境?

使用 Windows 文件

WSL 系統可以通過 /mnt/<盤號>/ 目錄(掛載點)來訪問你計算機上的文件系統。舉個例子,你的 Windows 上的 C: 和 D: 根目錄可以在 WSL 中相應地通過 /mnt/c 和 /mnt/d 訪問。當你要把你的 Windows 下的項目文件、下載的內容和其它文件用到 Linux/Bash 之中時這很有用。

上圖顯示的兩個目錄分別對應於我的計算機上的 SSD 和硬碟:

這是邏輯掛載,所以當你在 shell 中使用類似 mount 這樣的命令時它們不會顯示。但是它們可以如你預期的那樣工作。舉個例子,在 Windows 中,我在我的 C 盤根目錄下放了一個名為 test.txt 的文件,我可以在 WSL 中如下訪問它:

在 Build Tour 大會期間,我們要確保所有的演示都可以在沒有互聯網時也能正常工作(你絕不會知道會場的網路是什麼樣子的) ,所以為了讓 Bash/WSL 可以演示 Git 操作,該演示訪問的是本地計算機上的 Windows 文件,我在 Windows 上的 C:gitNetHack 下設置一個本地倉庫。 要在 WSL 中進行 clone 操作,我執行了如下命令:

$ git –clone file:///mnt/c/git/NetHack

該命令告訴 git 使用 file:// 協議,並 clone 了位於 /mnt/c/git/NetHack 下的倉庫。你可以以類似的方式來訪問你的 Windows 下的所有文件。

警示:就像在其它終端中一樣,如果你不小心的話,你可以在 Bash 中修改/刪除 Windows 文件系統中的文件。舉個例子,你可以像下面這樣來幹掉你的 Windows ,假如你有合適的許可權的話。

$ rm -rf /mnt/c/  [千萬別試!][千萬別試!][千萬別試!]

我之所以鄭重提醒是因為我們很多人都是剛剛接觸 Linux 命令,它們不是 Windows 命令。

這種可以讓文件系統集成到一起的魔法來自 DrvFs。如果你希望了解該文件系統的更多細節,以及它是如何工作在 WSL 中的,WSL 團隊為此寫了一篇詳細的文章

當然, 文件系統訪問只是 WSL 其中的一部分功能而已,許多開發任務還需要通過 HTTP 或其它網路協議訪問遠程資源。

發起 HTTP 請求

從腳本或命令行而不是從一個編譯好的程序或 Web 頁面上發起 REST 或其它 HTTP(或 FTP)請求是很有用的。就像在大多數 Linux 發行版一樣,WSL 也包括了類似 curl 或 wget 獲取資源這樣的標準功能,它們可以用來發起 HTTP 或者其它網路請求。舉個例子,下面是使用 curl 對 Github 發起 REST 請求來獲取我個人的屬性信息:

$ curl -i https://api.github.com/users/Psychlist1972
HTTP/1.1 200 OK
Server: GitHub.com
Date: Wed, 13 Jul 2016 02:38:08 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 1319
Status: 200 OK
...
{
  "login": "Psychlist1972",
  "avatar_url": "https://avatars.githubusercontent.com/u/1421146?v=3",
  "url": "https://api.github.com/users/Psychlist1972",
  "name": "Pete Brown",
  "company": "Microsoft",
   ...
}
$

你可以用它和 Bash 腳本來創建一個 REST API 的快速測試客戶端,也可以用來探測一個 Web 頁面或伺服器並報告其返回的狀態。它用來從網上下載文件也很棒,你可以簡單地重定向輸出到一個文件而不是在屏幕上顯示它:

$ curl -i https://api.github.com/users/Psychlist1972 > pete.json

我也是一個 PowerShell 用戶,甚至還使用 Windows 10 MIDI in PowerShell 創建了一些有趣的擴展,也修復過出現在特定的錄音硬體設備上的一些文件問題。作為長時間的 .NET 開發者和愛好者,我經常使用和擴展 PowerShell 以滿足我的項目需求。但是 PowerShell 並不是一個可以運行所有的那些 Bash 腳本和針對 Linux 的開源工具的地方。我希望以一種最簡單、最舒服的方式來完成這些任務,在某種意義上,這意味著我們需要在 Bash 中完成它們。

我已經一掠而過的介紹了 Bash、Bash 腳本以及你可以在 shell 中完成的任務。到目前為止,我談論的都是有助於開發工作的那些功能。但是在 WSL 中實際的開發和編譯工作是怎樣的?我在 Build Tour 大會上演示了下面這個部分。

Build Tour 大會上的演示:NetHack

這個夏初,來自微軟的講演者們向大家演示了一些來自 Windows 和微軟雲上的很酷的開發者新功能。作為其中的一部分,我以一種好玩的方式來演示了 WSL,而且這是一種和開發者們相關的方式。

我個人想要展示使用 git 和一些傳統的終端開發工具,我已經寫好了 Bash 的演示程序,包括了這些基礎的東西(用 Python 和 Ruby 寫的「Hello World」),不過我還是想要更有衝擊力一些。

我回想起我在大學的時光,那時我們在 Unix(DEC Ultrix 及 SunOS)和 VAX/VMS 之間折騰,Unix 幾乎全是命令行環境。在我們學校,絕大多數使用圖形工作站的用戶只是為了在不同的窗口打開多個終端會話而已,當然,會在桌面背景放上一張超酷的月相圖。大部分學生都是使用 VT-220 終端來打開他們的會話(學校離波士頓不遠,所以我們有很多 DEC 設備)。

那時,計算機系的學生們主要玩兩大遊戲:MUD (主要是 lpMUD 和當時剛出的 DikuMUD)和 NetHack。NetHack 和其它的 Roguelikes 類遊戲被視為歷史上最有影響力的遊戲之一,它們是許多現在流行的地牢冒險和角色扮演類遊戲的鼻祖。

NetHack 有很長的歷史,現在的它包含了來自幾十年前的幾十萬行 *nix 代碼,以及後來補充的一些代碼。該遊戲使用 curses (及其替代品)作為終端交互方式,需要通過 lex、 yacc(或 flex 和 bison)和 cc(或 gcc),以及一堆其它的開發工具構建。

它是由 C 語言編寫的,並包括了一些用 Bourne shell 編寫的複雜的腳本配置功能。我覺得它是一個體現 WSL 和 Bash on Windows 10 的開發者能力的不錯而有趣的方式。由於使用了 curses(在 Linux 和 WSL 中是 libncurses 庫),它也可以用來展示 Windows 10 中命令行窗口中的終端模擬能力。

以前,在我們的分時 Ultrix 伺服器上從源代碼構建 NetHack 要花費掉我們很多時間,而現在我的個人計算機上只需要幾分鐘就可以搞定。我喜歡這種技術進步。在 Linux 或 WSL 上配置和編譯 NetHack 有容易和複雜兩種方式。為了節省時間,我們會以容易的方式來進行。

前置需求

首先,更新你的 WSL 環境,確保你的軟體是最新的。在安裝新的軟體包之前,這是一個好的做法。

$ sudo apt update
$ sudo apt upgrade

然後,安裝必須的開發工具。最簡單的辦法就是使用 build-essential 軟體包,它包括了 Linux 開發者構建以 C/C++ 開發的軟體時所需的絕大部分程序。

$ sudo apt install build-essential

這要花幾分鐘。如果你想更加深入地了解,你可以分別安裝 gcc、gdb、make、flex、bison 以及 NetHack 文檔中提到的其它工具。不過如果你是一位開發者,有時候你可能還需要一些其它工具。 build-essential 基本上提供了你所需的工具集。

然後,安裝 git。如你所想,很容易:

$ sudo apt install git

就像在 Linux 中一樣,你可以添加一個 git 的 PPA 來獲取較新的版本,不過這裡我們有一個就行了。

最後,我們需要安裝 curses(實際上是 ncurses)來進行終端屏幕交互。

$ sudo apt install libncurses-dev

當我們完成這些步驟之後,就可以開始構建 NetHack 了。

構建 NetHack

官方的 NetHack 倉庫放在 GitHub 上,首先我們需要把它抓取下來放到我們的主目錄裡面。

$ cd ~$ git clone http://github.com/NetHack/NetHack

因為 NetHack 支持很多種操作系統,所以我們需要做一些基礎配置來告訴它我們使用的是 Linux,並且用開源的 gcc 代替了了 Unix 上 cc 的作用。

如我所提到的,這有好幾種辦法可以實現。有些人想很周到,將這些配置信息放到了 hints 文件中。相信我,使用 hints 文件會避免遇到該 GitHub 倉庫中提到的很多麻煩。在 README 文件和其它文檔中並沒有著重提到如何使用 hints 文件,我們可以這樣做:

$ cd NetHack/sys/unix
$ ./setup.sh hints/linux

這將會設置 Makefile 正確的使用 Linux 下的工具、庫及其路徑。這個設置腳本很強大,它做了大量的配置工作,很高興它在 WSL 中工作的也很好。如果你很好奇這個腳本是如何寫的,你可以使用你的編輯器打開它一窺究竟。

然後,開始最終的構建:

$ cd ~/NetHack
$ make all

構建完成之後,你需要安裝它。這其實就是將可執行文件複製到目標位置:

$ make install

它會安裝到你的 ~/nh 文件夾下, NetHack 放在 ~/nh/install/games 目錄,名為 nethack。要運行它,切換到該目錄(或輸入完整路徑)並輸入:

$ cd ~/nh/install/games
$ nethack

然後,屏幕會清屏並顯示你可以玩 NetHack 了。注意,所有的東西都是在這個 Ubuntu Linux 環境中完成的,根本不需要任何 Windows 特有的東西。

玩 NetHack

由於終端遊戲的局限性和 NetHack 的複雜性,這裡只能一帶而過。對於初次接觸它的人來說,還有一些神秘的地方,不過我覺得我們程序員們從來不怕挑戰未知。

方向鍵和 vi(vim)中的一樣,HJKL 是左、下、上、右。要退出遊戲,你可以在地下城頂層找到樓梯出口然後使用它就可以,或者直接按下 CTRL-C 強制退出。

在 NetHack 中, @ 符號代表你自己,每一層都由房間、走廊、門,和向上及向下的樓梯組成。怪物寶箱和物品以各種 ASCII 字元組成,你慢慢就會熟悉它們。為了符合 Roguelikes 遊戲規範,並沒有存檔功能,你只有一條命。如果你死了就只能重玩,地下城環境是隨機生成的,各種物品也是打亂放置的。

NetHack 遊戲的目的是在地下城生存,收集金子和物品,儘可能的幹掉各種怪物。除了這些目的之外,你就是不斷在其中玩來找它們。規則大致遵循「龍與地下城(DnD)」的武器、技能等規則。

下面的 NetHack 截屏上可以看到有三個房間和兩個走廊。向上的樓梯在左上角的房間里,我現在在右上角的房間,還有一些寶箱和其它物品。

如果在你的遊戲中沒有顯示顏色,可以創建一個名為 ~/.nethackrc 的文件,並放入如下內容:

OPTIONS=color:true,dark_room:true,menucolors:true

註:如果 ASCII 字元圖形不是你的菜,但是你喜歡這種類型的遊戲,你可以在微軟商店搜索「roguelike」來找到視覺上更好看的這種遊戲。

當然,NetHack 很古老了,可能只有特定年齡段的人們喜歡它。不過,構建它用到了大量重要的開發工具和 *nix 操作系統功能,也包括終端模擬功能。從這裡可以看到,從 gcc、gdb、make、bison 和 flex 到更現代一些的 git,都在 WSL 裡面工作的很好。

如果你想看看 Build Tour 大會上的演示,你可以在 Build Tour 加拿大大會上看到這個講演。WSL 的這部分演示在 6:20 開始。

希望你能喜歡在 NetHack 地下城中的探險。

C 和 C++ 都很偉大,就像其他的那些經典的開發工具一樣。你甚至還可以用普通的 Bash 腳本做到很多。不過,也有很多開發者喜歡用 Python 做為他們的腳本語言。

Python

你可以在網上找到很多 Python 腳本的例子,這意味著 Python 越來越流行,也越來越有用了。當然,大多數情況下這些例子都是運行在 Linux 下的。在過去,這就需要我們有另外一台安裝著 Linux 的機器來運行它們,或者使用虛擬機和多引導,否則就需要修改一些東西才能讓他們運行在 Windows 下的 Python 環境中。

這是都不是無法解決的問題,但是它會日漸消磨開發人員每天的生活。通過 WSL,不用折騰你就擁有了一個兼容的、具有 Python 功能和 shell 變數的子系統。

要安裝最新的 Python 開發版本和 Python 包安裝器 pip,在 Bash 中執行如下命令:

$ sudo apt install python-pip python-dev
$ sudo pip install --upgrade pip

現在 Python 安裝好了,我要展示給你如何從網上獲取一個典型的 Linux 下的 Python 例子並讓它直接工作起來。我去 Activestate Python 菜譜站找一個排名第一的 Python 例子。好吧,我走眼了,排名第一的是列印出整數名稱的腳本,這看起來沒啥意思,所以我選擇了第二名:俄羅斯方塊。我們每天都能看到 Python 出現在各種地方,所以這次讓我們去玩另外一個遊戲。

我打開了 nano 編輯器,從 Windows 上的瀏覽器中打開的頁面上複製了這 275 行 Python 代碼,然後粘貼到我的 WSL 終端窗口終端中的 nano 中,並保存為 tetris.py ,然後執行它:

$ python tetris.py

它馬上就清屏並出現了俄羅斯方塊的遊戲。同 NetHack 一樣,你可以使用同樣的 vi 標準的方向鍵來移動(以前是使用滑鼠和 WSAD 鍵來移動,而右手使用 HJKL 鍵更方便)。

如我所提到的,你當然可以不用 WSL 就在 Windows 中運行 Python。然而,要想快速簡便,不用修改 Linux 下的 Python 代碼,只需要簡單的複製粘貼代碼即可運行,則可以極大的提高開發者的效率。

這是真的。這並不是要替代 Windows 原生的工具,比如 Python、PowerShell、C# 等等,而是當你需要在現代的開發工作流程中快速而有效地完成一些事情時,可以避免種種折騰。

包括 Bash、Python 以及其它所有的 Linux 原生的命令行開發工具,WSL 為我的開發工作提供了所有需要的工具。這不是一個 Linux 伺服器,甚至也不是一個完整的客戶端,相反,它就是一個可以讓我避免每天折騰,讓我在 Windows 上開發更有效率、更有快感的一個東西!

重置你的 WSL 環境

隨便去試吧,如果你搞壞了你的 WSL 環境,它很容易重新安裝。在進行之前,請確保做好了任何重要內容的備份。

C:> lxrun.exe /uninstall /full
C:> lxrun.exe /install

你使用 Bash 和 WSL 的感覺如何?

我們希望 WSL ,特別是 Bash 可以在 Windows 10 中幫你帶來更高的效率,減少每天的開發中的折騰。

你對 Windows 10 上的 WSL 怎麼看?你喜歡使用它嗎?

開發團隊做了大量的工作希望讓 WSL 成為一個為開發者提供的強大的終端工具。如果你有任何反饋或運行出現問題,我們推薦你查看一下 GitHub 反饋頁面,以及 用戶之聲的反饋和投票站點。我們真的希望聽到你的聲音。

更多參考與延伸閱讀

Linux shell 編程是一個龐大的話題,在網上有很多這方面的內容。如果你還不夠熟悉它們,想要了解更多,可以看看各種 Bash 教程。可以從這一份開始

還有一些其他的參考資料也許對你有用:

哦,當然,要更多的了解 NetHack,請訪問 NetHack 主站


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國