安装 PowerShell Fedora Linux

PowerShell(也写成 pwsh)是由 Microsoft 开发和维护的强大的开源命令行和面向对象的 shell。 它在语法上对用户来说是冗长而直观的。 本文是有关如何在主机上以及 Podman 或 Toolbox 容器内安装 PowerShell 的指南。

目录

为什么使用 PowerShell

顾名思义,PowerShell 功能强大。 语法对最终用户来说是冗长且语义清晰的。 对于那些不想一直写长命令的人来说,大多数命令都是别名的。 可以使用 Get-Alias 或查看别名 这里.

然而,PowerShell 和传统 shell 之间最重要的区别在于它的输出管道。 普通 shell 输出字符串或字符流,而 PowerShell 输出对象。 这对命令管道的工作方式具有深远的影响,并具有很多优势。

示范

以下示例说明了详细程度和简单性。 以磅符号开头的行 (#) 是评论。 开头的行 附言 > 是命令, 附言 > 作为提示:

# 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

这很好地表明,在 PowerShell 中通常不需要使用 Bash 脚本通常需要的 cut、sed、awk 或类似工具重新格式化输入输出。 原因是 PowerShell 的工作方式与传统的 POSIX shell(如 Bash、Zsh)或其他 shell(如 Fish)根本不同。 传统 shell 的命令作为字符串输出,而在 PowerShell 中它们作为对象输出。

Bash 和 PowerShell 的比较

以下 example 说明 PowerShell 中的对象输出与 Bash 中的传统字符串输出相比的优势。 假设您需要一个脚本来输出所有占用 200MB 或更多 RAM 的进程。 使用 Bash,这可能看起来像这样:

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

PID    RSS     COMMAND
A      B       C
[...]

第一个明显的区别是可读性,或者更具体地说,语义清晰度。 ps 和 awk 都不是自我描述的。 ps 显示 p过程 status 和 awk 是一种文本处理工具和语言,其字母是其开发人员姓氏的首字母, 一种嗬, W艾因伯格, ķ厄尼根(见 维基百科)。 然而,在将其与 PowerShell 进行对比之前,请检查脚本:

  • ps -e 输出所有正在运行的进程;
  • -O rss 输出 ps 的默认输出加上每个进程使用的千字节数量,即 rss 字段; 此输出如下所示:
    PID  RSS   S TTY TIME     COMMAND  1    13776 S ?   00:00:01 /usr/lib/systemd/systemd
  • | 管道运算符使用左侧命令的输出作为右侧命令的输入。
  • awk -F’ ‘ 将“空格”声明为输入字段分隔符。 所以按照上面的方法 examplePID 是第一个,RSS 第二个,依此类推。
  • ‘{ if($2 >= (1024*200) 是实际 AWK 脚本的开始。它检查字段 2 (RSS) 包含大于或等于 1024*200KB(204800KB,或 200MB)的数字;
  • { printf(“%st%st%sn”,$1,$2,$6);} }’ 继续脚本。 如果前一部分的计算结果为真,则输出第一个、第二个和第六个字段 (PID, RSS 和 COMMAND 字段)。

考虑到这一点,退后一步,看看这个脚本的编写和工作需要什么:

  • 输入命令 ps 必须在其输出中包含我们想要过滤的字段。 默认情况下不是这种情况,需要我们使用带有 rss 字段的 -O 标志作为参数。
  • 我们必须将 ps 的输出视为输入字段的列表,要求我们知道它们的顺序和结构。 或者换句话说,我们至少必须知道 RSS 将是第二个字段。 这意味着我们必须事先知道 ps 的输出会是什么样子。
  • 然后我们必须知道我们过滤的数据的单位以及处理工具的工作单位。这意味着我们必须知道 RSS 字段使用千字节,而 awk 也是如此。 否则我们将无法编写表达式 ($2 <= 1024*200)

现在,将上面的内容与等效的 PowerShell 进行对比:

# 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 example.

要查看命令输出对象的所有可用属性及其类型,只需执行以下操作:

PS > Get-Process | Get-Member

安装 PowerShell

PowerShell 有多种包格式,包括 Fedora Linux。 本文介绍如何安装 PowerShell Fedora Linux 使用各种方法。

我建议本地安装它。 但我还将展示如何在容器中进行操作。 我将展示如何使用官方的 Microsoft PowerShell 容器和 Fedora Linux 30 工具箱容器。 容器方法的优点是它可以保证工作,因为所有依赖项都捆绑在其中,并且与主机隔离。 无论如何,我建议在本地进行,尽管官方文档仅明确说明 Fedora Linux 发布 28 到 30 为受支持。

笔记: 支持意味着保证工作。 这并不一定意味着与其他版本不兼容。 这意味着,虽然不能保证,高于 30 的版本仍然可以工作。 他们确实在我们的测试中起作用。

设置 PowerShell 并在容器中运行它比直接在主机上运行更困难。 安装需要更多时间,您将无法直接运行主机命令。

使用包管理器在主机上安装 PowerShell

方法 1:Microsoft 存储库

安装尽可能简单,并且该过程与通过第三方存储库安装的任何其他软件没有区别。

它可以分为四个一般步骤:

  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:RPM文件

这种方法与第一种方法没有明显的不同。 事实上,它在安装 RPM 文件时隐式添加了 GPG 密钥和存储库。 这是因为 RPM 文件在其元数据中包含指向两者的链接。

首先,从 PowerShell 核心 GitHub 存储库. 请参阅 readme.md
链接的“获取 Powershell”表。

其次,输入以下内容:

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

分别替换为您要使用的版本和架构,例如 example 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 容器

波德曼是一个 开放容器倡议 (OCI) 兼容的 Docker 替代品。

微软提供了一个 PowerShell Docker 容器. 以下 example 将与 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 以 chroot 到 root,然后运行主机命令。

要分解命令,除非指定,否则一切都是强制性的:

  • – 它创造了一个持久的环境,当你进入它时不会把你踢出去;
  • –privileged 为容器提供扩展权限(可选);
  • –rm 退出时删除容器;
  • –name powershell 将容器的名称设置为powershell;
  • –env-host 将所有主机环境变量设置为容器的变量(可选);
  • –volume $HOME:$HOME 挂载用户目录;
  • –volume /:/var/host 将根目录挂载到 /var/host (可选);
  • –net=host –pid=host –ipc=host 在主机的命名空间中运行进程,而不是为包含的进程运行一组单独的命名空间;
  • docker.io/microsoft/powershell 进入容器;
  • /usr/bin/pwsh -WorkingDirectory $(pwd) 进入当前目录中的容器(可选)。

可选但非常方便:使用脚本为 pwsh 别名,以便通过键入 pwsh 轻松访问 Podman 容器。

要删除 PowerShell 映像,请运行以下命令。

$ podman rmi mcr.microsoft.com/powershell

方法二: Fedora Linux 工具箱容器

Toolbox 是一个优雅的解决方案,可以在不影响整个主机系统的情况下设置持久环境。 它充当 Podman 的包装器,并负责提供前面方法中演示的许多标志。 出于这个原因,Toolbox 比 Podman 更容易使用。 它旨在用于开发和调试。 使用 Toolbox,您可以像直接在 Fedora 工作站主机(包括 dnf)。

安装过程类似于在主机上的安装方法,唯一的区别是这些步骤是在容器内完成的。 确保您已安装工具箱包。

准备和进入 Fedora 34 工具箱容器是一个两步过程:

  1. 创建 Fedora 34 工具箱容器
  2. 运行 Fedora 34 工具箱容器
$ toolbox create --image registry.fedoraproject.org/f34/fedora-toolbox
$ toolbox enter --container fedora-toolbox

然后,按照以下说明进行操作 方法 1:Microsoft 存储库.

可选但非常方便:使用工具箱运行别名 pwsh –container fedora-toolbox pwsh 通过键入 pwsh 轻松访问工具箱容器。

要删除 Toolbox 容器,请确保您已通过输入 exit 停止了 Toolbox 会话,然后运行以下命令:

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