Linux中國

在 Fedora Linux 系統上安裝 PowerShell

PowerShell(也可寫作 pwsh)是一個功能強大的開源命令行工具,它是面向對象的,由微軟開發和維護。它的語法特徵冗長,但對用戶來說比較直觀。本文介紹如何在主機上和在 Podman 或其他容器內安裝 PowerShell

為何使用 PowerShell

PowerShell,正如它的名字那樣,是一個強大的工具。它的句法冗長,但語義清晰。對那些不願意寫長命令的開發者來說,PowerShell 的大多數命令都有別名。可以使用 Get-Alias 或點擊 此處 查詢別名的使用方法。

PowerShell 和傳統的 Shell 最大的區別在於它的輸出管道。普通的 Shell 輸出的是字元串或字元流,PowerShell 輸出的是對象。這對命令管道的工作方式具有深遠的影響,而且它具有很多的優點。

演示例子

下面的例子體現的是冗長而清晰的特點。以 # 號開頭的行是注釋行。以 PS > 開頭的行是命令行,PS > 是提示符:

# Return all files greater than 50MB in the current directory.
## Longest form
PS > Get-Childitem | Where-Object Length -gt 50MB
## Shortest form (with use of aliases)
PS > gci | ? Length -gt 40MB
## Output looks like this
    Directory: /home/Ozymandias42/Downloads
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ------          20/08/2020    13:55     2000683008 40MB-file.img

# In order: get VMs, get snapshots, only select the last 3 and remove selected list:
PS > Get-VM VM-1 | Get-Snapshot | Select-Object -Last 3 | Remove-Snapshot

上述例子說明了:Bash 腳本經常需要用 cutsedawk 等工具對輸入/輸出進行格式化,而使用 PowerShell 時通常就沒有這個必要了。這是因為 PowerShell 的工作機制跟傳統的 POSIX shell(例如 Bash、Zsh、Fish等)有本質的不同。傳統的 Shell 的命令輸出形式是字元串,而在 PowerShell 中,命令輸出形式為對象。

Bash 與 PowerShell 的比較

下面的例子說明了與 Bash 中的字元串輸出模式相比,PowerShell 的對象輸出模式的優點。假設你需要寫一段腳本,該腳本的作用顯示所有進程,這些進程一共佔用了 200MB 內存空間。如果使用 Bash,大致如下:

$ ps -eO rss | awk -F' ' 
    '{ if($2 >= (1024*200)) { 
        printf("%st%st%sn",$1,$2,$6);} 
     }'

PID    RSS     COMMAND
A      B       C
[...]

第一個顯而易見的差別就是可讀性,或更確切地說是語義清晰度。 psawk 都不是自描述的。ps 命令的功能是顯示進程狀態;awk 是一種文本處理工具和語言,這個辭彙每個字母都是前期開發人員的名字(Aho, Weinberger, Kernighan(詳見 維基百科)的首字母。然而,在把它與 PowerShell 作比較前,先看看這個腳本:

  • ps -e 輸出所有運行中的進程;
  • -O rss 輸出 ps 的默認輸出內容,再加上 RSS 欄位 —— 每個進程使用的千位元組數(以 KB 為單位);輸出結果類似於:
PID  RSS   S TTY TIME     COMMAND  
1    13776 S ?   00:00:01 /usr/lib/systemd/systemd
  • | 管道操作符使用左邊命令的輸出作為右邊命令的輸入。
  • awk -F' ' 定義「空格」,作為輸入欄位分隔符。以上面的例子來說,PID 是第一個欄位,RSS 是第二個欄位,依此類推。
  • '{ if($2 >= (1024*200)) { 是實際的 AWK 代碼起始處。它的作用是檢查第二個欄位(RSS)是否包含一個大於或等於 1024*200 的數字;
  • printf(「%st%st%sn」,$1,$2,$6);} 腳本繼續。如果前面的條件成立,則輸出第一、第二和第六個欄位(分別是 PIDRSSCOMMAND 欄位)。

考慮到這一點,退一步說,編寫這段腳本需要什麼才能令它工作:

  • 輸入命令 ps 的輸出中必須包含我們想要過濾的欄位。這在默認情況下是沒有的,需要我們使用 -O 標誌和 rss 欄位作為參數。
  • 我們需要將 ps 的輸出當作一組輸入欄位,所以我們還應當知道它們的順序和結構。換句話說,我們至少需要確定 RSS 是第二個欄位。這也意味著我們需要提前知道 ps 的輸出信息的大致情況。
  • 然後我們需要知道過濾的數據是什麼單位,以及相關工具的單位是什麼。也就是我們需要知道 RSSawk 欄位使用 kb。不然我們就不能寫出 ($2 >= 1024*200) 這樣的表達式。

現在,我們把前面的命令跟 PoserShell 中等價的命令比較:

# Longest form
PS > Get-Process | Where-Object WorkingSet -ge 200MB
# Shortest form (with use of aliases)
PS > gps | ? ws -ge 200MB

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
------    -----      -----     ------      --  -- --------     A        B          C          D       E   F           G
[...]

首先應該注意到,語義非常清晰。這些命令都是自描述的,能清晰描述它們做什麼。

此外,不需要對輸入-輸出重新格式化,也不需要關心輸入命令使用的單位。這是因為 PowerShell 輸出的是對象,而非字元串。

考慮下述情況,就可以理解這些內容。在 Bash 中,命令的輸出信息就是終端顯示的信息。在 PowerShell 中,終端顯示的信息並不等於實際可用的信息。這是由於 PowerShell 中的輸出-列印系統使用的也是對象。因此 PowerShell 中每一條命令都對輸出的對象的一些屬性作了可列印的標記,也對一些屬性作了不可列印的標記。然而,它總是包括所有的屬性,而 Bash 只包括它實際列印的內容。我們可以把它想像成 JSON 對象。Bash 中的輸出位置被分為一些「欄位」,以空格或製表符為標誌,在 PowerShell 中它是一個容易定址的對象屬性,只需要知道它的名稱即可使用。就像上述例子中的 WorkingSet 那樣。

為了看到一條命令的輸出對象的所有屬性和它們的類型,可以進行以下操作:

PS > Get-Process | Get-Member

安裝 PowerShell

PowerShell 安裝包的形式有若干種,包括 Fedora Linux 中使用的 RPM 安裝包。本文介紹在 Fedora Linux 中如何使用多種方法安裝 PowerShell。

我推薦使用原生的方法安裝。但我也會介紹如何在容器中安裝。我將展示使用官方微軟 PowerShell 容器和 Fedora Linux 30 的 Toolbox 容器。使用容器的優點在於,所有的依賴捆綁在其中,並且與主機隔離,所以它一定是有效的。無論如何,雖然官方文檔只是明確指出支持 Fedora Linux 發行版的 28-30 版本,我還是建議使用原生的方法安裝。

注意: 官方支持意味著一定有效。但其他的版本也不是一定不兼容。也就是說,高於 30 的發行版也應該有效。經過測試,的確如此。

在容器中設置並運行 PowerShell 比直接在主機上運行它難度更大,安裝需要花費更多時間,而且你還不能直接運行主機的命令。

在主機上使用包管理器安裝 PowerShell

方法一:使用微軟倉庫

安裝過程很直接,而且跟通過第三方倉庫安裝其他軟體沒什麼區別。

通俗地說,安裝過程可以分為四步:

  1. 添加新倉庫的 GPG 密碼
  2. 在 DNF 倉庫列表中新增相應的倉庫
  3. 刷新 DNF 緩存,將新倉庫中的有關包包含進來
  4. 安裝新包

然後使用命令 pwsh 啟動 PowerShell。

$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
$ curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
$ sudo dnf makecache
$ sudo dnf install powershell
$ pwsh

欲刪除倉庫和包,運行以下命令:

$ sudo rm /etc/yum.repos.d/microsoft.repo
$ sudo dnf remove powershell
方法 2:使用 PRM 文件

這種方法與第一種方法沒有明顯的差別。實際上,在安裝 RPM 文件時,隱式添加了 GPG 密碼和倉庫。這是由於 RPM 文件包含它們兩者的關聯關係,保存在它的元數據中。

首先,從 PowerShell GitHub 倉庫 獲取相應版本的 .rpm 文件。然後查看 readme.md 文件中的 「獲取 PowerShell」 部分的內容。

第二步,輸入以下命令:

$ sudo dnf install powershell-<version>.rhel.7.<architecture>.rpm

<version><architecture> 節點中填寫各自的內容,例如 powershell-7.1.3-1.rhel.7.x86_64.rpm

你也可以使用鏈接運行它,不指定版本和架構,先把它下載到本地。

$ sudo dnf install https://github.com/PowerShell/PowerShell/releases/download/v<version>/powershell-<version>.rhel.7.<architecture>.rpm

欲刪除 PowerShell,運行以下命令:

$ sudo dnf remove powershell

通過容器安裝

方法一:使用 Podman 容器

Podman 是一個兼容 開放容器倡議(OCI)的、嵌入式的容器引擎,它可以代替 Docker。

微軟提供了 PowerShell Docker 容器集成工具。下面的例子將在 Podman 中使用容器。

欲了解更多關於 Podman 的信息,可以訪問 Podman.io。Fedora 雜誌還有一個專為 Podman 設計的 標籤

欲在 Podman 中使用 PowerShell,運行以下腳本:

$ podman run 
  -it 
  --privileged 
  --rm 
  --name powershell 
  --env-host 
  --net=host --pid=host --ipc=host 
  --volume $HOME:$HOME 
  --volume /:/var/host 
  mcr.microsoft.com/powershell 
  /usr/bin/pwsh 
  -WorkingDirectory $(pwd)

這段腳本為使用 PowerShell 創建了一個 Podman 容器,並立即接入其中。它還將 /home 和主機的根目錄掛載到容器中,確保它們在容器中是可用的。無論如何,在 /var/host 目錄下,主機的根目錄是可訪問的。

但是,在容器內部,你只能間接運行主機命令。有一種變通辦法,就是先運行 chroot /var/host 改變根目錄,然後運行主機命令。

為了把命令拆分開來講解,除非特別指定,以下所有內容都是強制性的:

  • -it 創建一個持久環境,當你進入該環境後,不會輕易退出;
  • --privileged 給予容器擴展的許可權(可選);
  • --rm 當你退出時移除容器;
  • --name 設置容器名稱;
  • --env-host 將所有主機的環境變數設置為容器的變數(可選);
  • --net=host --pid=host --ipc=host 在主機的命名空間中運行進程(而非一組單獨的名稱空間);
  • --volume $HOME:$HOME 掛載用戶目錄;
  • --volume /:/var/host 將主機根目錄掛載到 /var/host(可選);
  • mcr.microsoft.com/powershell 進入容器;
  • /usr/bin/pwsh 可選但很方便的參數:用別名 pwsh,腳本中有了它,可以輸入 pwsh 輕鬆訪問 Podman 容器;
  • -WorkingDirectory $(pwd) 在當前目錄下進入容器(可選)。

欲移除 PowerShell 鏡像,運行以下命令:

$ podman rmi mcr.microsoft.com/powershell
方法二:Fedora 系統的 Toolbox 容器

在不影響主機系統的情況下安裝持久化環境,使用 Toolbox 容器是一種巧妙的解決方案。它充當了 Podman 的封裝器,負責提供大量的標誌,就像方法一中提到的那樣。因此,Toolbox 比 Podman 容易使用。它可以用來開發和調試。有了 Toolbox,你可以運行任何命令,跟你直接在 Fedora 工作站主機上運行是一樣的。

安裝步驟跟在主機上安裝一樣,唯一的區別就是在容器內部進行。你需要確保已經安裝了 toolbox 包。

使用 Fedora 34 Toolbox 容器需要兩個步驟:

  1. 創建 Fedora 34 Toolbox 容器
  2. 運行 Fedora 34 Toolbox 容器
$ toolbox create --image registry.fedoraproject.org/f34/fedora-toolbox
$ toolbox enter --container fedora-toolbox

接著,按照 方法一:使用微軟倉庫 中的相關內容操作。

可選但非常方便的做法:使用別名 pwsh,可以輕鬆地訪問 Toolbox 容器:

toolbox run –container fedora-toolbox pwsh

欲移除 Toolbox 容器,需要確保你已經使用 exit 關閉了 Toolbox 會話,然後運行以下命令:

$ podman kill fedora-toolbox
$ toolbox rm fedora-toolbox

via: https://fedoramagazine.org/install-powershell-on-fedora-linux/

作者:TheEvilSkeleton, Ozymandias42 選題:lujun9972 譯者:cool-summer-021 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


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

對這篇文章感覺如何?

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

    You may also like

    Leave a reply

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

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

    More in:Linux中國