将PowerShell与Linux一起使用

什么是Powershell?

PowerShell是一种通常用于自动化计算机系统管理的跨平台解决方案,但也可用于常规编码。PowerShell由命令行壳,脚本语言和配置管理框架组成。PowerShell在Windows,Linux和MacOS操作系统上运行。由于操作系统的根本差异,某些PowerShell命令(称为CMDLET)是没有意义的。例如,Powershell Get-acl CMDLET不适用于Linux系统,因为Linux文件系统不使用NTFS访问控制列表(ACLS)。要查看可用Linux PowerShell CMDLET的列表,请运行 获取命令.

为什么Linux Powershell?

在Linux中,一个命令的输出可以将其管道输送到另一个命令中。例如:

ls | sort -r | more

这反向分类当前目录的内容,并在列表中使用(如有必要)。也就是说,数据流的输出 ls 命令被管道 种类 然后将其数据流输出管道输送到 更多 命令。这样的powershell类似物如下:

Get-ChildItem | Sort-Object -Descending | Out-Host -Paging

哪个提出了一个问题,为什么要在本机版本上使用PowerShell?一个关键原因是对象(而不是简单的数据流)是在PowerShell CMDLET之间管道的。例如,无需解析文本即可从另一个输出流中提取信息。而且,由于PowerShell对象通常具有与之相关的大量属性,因此您可以相对容易地做一些相当强大的事情。例如,说您想找到Cron服务的PID。第一次尝试可能如下:

ps -aux | grep cron

这将产生类似于以下内容的输出:

root      1041  0.0  0.1 126384  1584 ?        Ss   22:25   0:00 /usr/sbin/crond -n
root      3519  0.0  0.0 123360   728 ?        Ss   23:01   0:00 /usr/sbin/anacron -s
root      4089  0.0  0.0 112808   976 pts/1    R+   23:09   0:00 grep --color=auto cron

Cron PID似乎是1041,尽管很难看不见桌子标题。假设是这种情况,我们需要访问第一行中的第二列。第一步可能是减少空格过多:

ps -aux | grep cron | tr -s ' '

这产生了:

root 1041 0.0 0.1 126384 1584 ? Ss 22:25 0:00 /usr/sbin/crond -n
root 3519 0.0 0.0 123360 728 ? Ss 23:01 0:00 /usr/sbin/anacron -s
root 4167 0.0 0.0 112808 972 pts/1 R+ 23:11 0:00 grep --color=auto cron

现在我们可以将第二列与 :

ps -aux | grep cron | tr -s ' ' | cut -d ' ' -f 2

生产:

1041
3519
4274

最后,我们可以如下获取第一行,以获得所需的结果,即1041:

ps -aux | grep cron | tr -s ' ' | cut -d ' ' -f 2 | head -1

使用PowerShell CMDLET输出对象而不是数据流的事实,以上的PowerShell版本简称:

(Get-Process -Name crond).Id

在这种情况下, get -process -name crond 返回代表Cron过程的对象。该对象具有一系列有用的属性,其中一个是过程ID(或PID)。要访问PowerShell对象的属性,您可以将其包裹在括号中,然后使用标准的"点"符号,如图所示。

安装Linux PowerShell

要在您最喜欢的Linux风味上安装PowerShell,请参阅Microsoft的 在Linux上安装PowerShell。如果未列出Linux发行版,请考虑 在Linux上安装PowerShell的替代方法.

例如,以下四个命令在CentOS 7上安装了最新版本的PowerShell:

# Optionally update all software packages:
  sudo yum -y update
  
# Register the Microsoft repository:
  curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
    
# Install PowerShell:
  sudo yum -y install powershell
    
# Start PowerShell:
  pwsh

可以看出,安装PowerShell是简单的。

其他Linux Powershell示例

一种关键技术是确定PowerShell对象实际具有的属性。这可以通过 聚会 cmdlet。例如,要确定PowerShell进程对象的属性,您可以使用:

Get-Process | Get-Member -Force

这表明有一个 小路 流程对象的属性。因此,我们可以使用它在CPU使用方面列出前10个过程,如下所示:

Get-Process | Sort-Object -Property CPU | Select-Object -Property Name, Path, CPU -Last 10

这会产生类似于以下的输出:

Name           Path                                CPU
----           ----                                ---
xfwm4          /usr/bin/xfwm4                     1.95
systemd        /usr/lib/systemd/systemd           3.63
rngd           /usr/sbin/rngd                     7.39
xfce4-terminal /usr/bin/xfce4-terminal            9.35
xrdp           /usr/sbin/xrdp                    22.05
ksoftirqd/0                                      26.21
pwsh           /opt/microsoft/powershell/7/pwsh  27.37
rcu_sched                                        45.44
Xvnc           /usr/bin/Xvnc                     59.27
NetworkManager /usr/sbin/NetworkManager         955.19

尽管有用,但我们可能想计算一个整体系统使用度量。第一个剪辑可能是简单地总结非页码内存(NPM),页面存储器(PM),工作集(WS)和CPU使用值。也就是说,我们定义了总体使用度量指标,如下所示:

总体us = npm + pm + ws + cpu。

在Powershell中,这可以如下完成:

Get-Process | Select-Object -Property @{Label = 'OverallUsage'; Expression = {$_.NPM + $_.PM + $_.WS + $_.CPU}}

@{} 哈希表(即键/值对)允许我们定义一个称为的属性 整体语句 其定义是上面显示的表达式。在这个表达中, $_ 代表管道对象。在这种情况下,一个单个过程对象 获取过程 返回(每个运行Linux进程一个)。然后,我们总和四个属性。这将导致以下(前几行):

    OverallUsage
    ------------
          520192
       815104.03
          794624
         1093632
      4902912.01
      3330048.37

现在,我们可以将这两个概念结合在一起:

Get-Process | Select-Object -Property Name, Path, @{Label = 'OverallUsage'; Expression = {$_.NPM + $_.PM + $_.WS + $_.CPU}} | Sort-Object -Property OverallUsage -Bottom 10

这会产生前10个总使用表,类似于以下内容:

Name                Path                             OverallUsage
----                ----                             ------------
Thunar              /usr/bin/thunar                    14073856.2
xfce4-power-manager /usr/bin/xfce4-power-manager       15970304.3
xfce4-panel         /usr/bin/xfce4-panel               16195584.9
xfdesktop           /usr/bin/xfdesktop                17588224.59
tuned               /usr/bin/python2.7                18898945.66
yum-cron            /usr/bin/python2.7                 22335488.2
xfce4-terminal      /usr/bin/xfce4-terminal            23642123.4
xrdp                /usr/sbin/xrdp                    26570776.34
Xvnc                /usr/bin/Xvnc                     82710598.14
pwsh                /opt/microsoft/powershell/7/pwsh 298852382.66

如果您愿意显示舍入的用法值,则可以使用:

Get-Process | Select-Object -Property Name, Path, @{Label = 'OverallUsage'; Expression = {[Math]::Round($_.NPM + $_.PM + $_.WS + $_.CPU)}} | Sort-Object -Property OverallUsage -Bottom 10

[MATH] :: round() 函数用于将单个总和到其最接近的整体值。

结论

在很多情况下,标准Linux命令比PowerShell CMDLET更有意义,而在许多情况下,相反,尤其吸引人的是您可以一起使用两个范式。作为一个简单的例子,请考虑:

Get-Process | Select-Object -Property Name, Path, Responding, Id |  grep cron

这会产生:

anacron    /usr/sbin/anacron    True   3018
crond      /usr/sbin/crond      True   1033
yum-cron   /usr/bin/python2.7   True   4760

第三列指示该过程是否响应。

如您所见,PowerShell和PowerShell与Linux命令的组合为解决和简化各种问题和任务提供了充足的机会。

1
订阅评论
提醒
0 评论
内联反馈
查看所有评论