远程 PowerShell 入门指南

您曾经想过从您的工作站轻松运行远程计算机上的PowerShell命令吗?好吧,通过PowerShell远程您可以。使用远程PowerShell,您可以以可持续的方式在多个远程系统上运行命令和脚本。

听起来有趣吗?继续阅读以了解如何以PowerShell方式驾驭那些远程计算机。

先决条件

本教程将进行实际演示。如果您想跟着做,请确保您至少有三台安装了PowerShell 7的计算机。其中一台将是您的管理计算机,另外两台将是远程计算机。

本教程将使用以下计算机。

  • A Windows 10 PC with PowerShell 7 installed as the management computer. You will launch remote commands from this machine.
  • A Windows 10 PC with PowerShell 7 installed. This machine will be the endpoint for remote PowerShell over WinRM.
    • A user account on the remote Windows machine with local administrator rights. This tutorial uses a user account called ma.
  • Linux机器启用了SSHD,用作通过SSH提供远程PowerShell终端。本教程使用Fedora 35
    • 在Linux机器上执行远程命令的用户帐户。该帐户应具有sudo和SSH访问权限。本教程使用名为test的帐户。如果您在Linux机器上没有帐户,请在此时创建用户帐户

在Windows上通过WinRM启用远程PowerShell

安装PowerShell 7时,有一个选项可以启用PowerShell远程功能,您可能已经在那时启用了它。但为了确保,按照以下步骤启用远程PowerShell。

1. 登录到远程Windows 10 PC。

2. 以管理员身份打开PowerShell。

3. 运行以下命令以启用远程PowerShell。

Enable-PSRemoting

该命令执行了几项配置更改,您将在控制台上看到。

Enabling Remote PowerShell on Windows over WinRM

在SSH上启用Linux上的远程PowerShell

WinRM专属于Windows,这意味着您无法使用它在Linux上启用远程PowerShell。相反,您可以在Linux上通过SSH启用远程PowerShell。假设您已经安装了PowerShell,请按照以下步骤操作。

1.登录到远程Linux系统并打开终端会话。

2.在文本编辑器中打开SSH服务器配置文件。使用您选择的文本编辑器,例如Gedit、Sublime或Nano。此示例使用Gedit。

sudo nano /etc/ssh/sshd_config

3.接下来,在文件中添加以下行。此行创建了一个托管PowerShell进程的SSH子系统。

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Create an SSH subsystem for PowerShell on Linux

4.关闭编辑器。

5.最后,通过运行以下命令重新启动SSH服务器。

sudo systemctl restart sshd

在本地机器上添加远程PowerShell受信任主机

此时,您的远程计算机已准备好接收命令。但是,如果远程PowerShell主机不在受信任主机列表上,则您的管理计算机可能会拒绝连接。为了避免可能的远程问题,您必须将远程主机添加到受信任主机列表中。

以管理员身份在管理计算机上打开PowerShell。

运行以下winrm命令。此命令将您的远程Windows(192.168.8.107)和Linux(192.168.8.171)机器添加到计算机的可信主机列表中。

winrm set winrm/config/client '@{TrustedHosts=" 192.168.8.171,192.168.8.107"}'
Adding remote machines as Trusted Hosts

在远程计算机上运行命令

所有准备工作就绪后,您将在本节中执行远程计算机上的命令。

1. 在管理计算机上打开一个新的PowerShell会话。

2. 现在,执行以下Invoke-Command命令,以列出用户ma在远程计算机上的前五个服务。要运行的命令出现在ScriptBlock开关的大括号之间,如下所示。

Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Windows host

3. 要在远程Linux主机上执行相同操作,请改为运行以下命令。请注意,-HostName替换了-ComputerName-UserName替换了-ComputerName。这些参数指示Invoke-Command cmdlet目标是一个SSH主机。

Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Linux host

在远程计算机上执行脚本

您还可以使用Invoke-Command cmdlet在远程计算机上运行PowerShell脚本文件。但是,您将指定-FilePath参数而不是指定-ScriptBlock参数,后跟脚本本地路径。

1. 首先,在本地计算机上创建一个名为nametime.ps1的PowerShell脚本文件。

2. 使用您喜欢的脚本编辑器打开脚本,并添加以下代码。然后保存该文件。

# nametime.ps1
hostname
Get-Date
Create the PowerShell script

3. 使用 Invoke-Command cmdlet,并使用 -FilePath 参数。 -FilePath 应指向脚本文件。在此示例中,脚本文件位于相同的工作目录。

# 在远程 PowerShell 上通过 WinRM 执行脚本
Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -FilePath .\nametime.ps1

# 在远程 PowerShell 上通过 SSH 执行脚本
Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -FilePath .\nametime.ps1
Invoke a script on remote PowerShell hosts

以交互方式管理远程计算机

在前一节中,您了解了如何在远程计算机上运行单个命令。在本节中,您将学习如何打开一个交互式会话,以便您可以在远程计算机上运行多个命令,就像在本地一样。

1. 使用 Enter-PSSession 命令在位于 192.168.8.107 的机器上以用户 ma 的身份启动远程会话。

Enter-PSSession -ComputerName 192.168.8.107 -Credential ma

在提示符下输入远程用户帐户密码,如下所示,ma

Entering an interactive remote session

您将看到一个新的提示符,如下所示。方括号内的IP地址表示远程 PowerShell 主机。

Viewing a remote prompt

3. 使用 dir 命令列出当前工作目录中的文件,如下所示。您可以在会话中执行任意数量的 PowerShell 命令 dir

dir

目录内容应该显示在屏幕上,如下截图所示。

Linting the files on a remote machine

4. 使用 Exit-PSSession cmdlet 退出会话,一旦完成远程计算机管理。

Exit-PSSession

退出后,您应该返回到本地提示符,如下截图所示。

Exiting a remote session

断开和重新连接远程 PowerShell 会话

可以将会话持久存储,作为交互式会话或一次性命令的替代选择。存储会话使您可以在不丢失上下文的情况下在会话之间切换。在本节中,您将学习创建和管理持久会话。

1. 运行 New-PSSession cmdlet 在远程计算机 192.168.8.107 上,以用户 ma 的身份(-Credential)创建一个会话。将会话保存在变量 $var 中,如下所示。

$var = New-PSSession -ComputerName 192.168.8.107 -Credential ma

2. 执行变量 $var,以查看其内容,如下所示。

$var

如下所示,您应该看到一个具有 RemoteMachine ComputerType 和状态为 Opened 的会话对象。

Displaying the details of a session

3. 运行 Enter-PSSession 命令以进入存储在 $var 中的会话。

Enter-PSSession $var

如果一切正常,提示符将更改为远程提示符,而不会有进一步的输出,如下所示。

Entering a persistent remote session

4. 在会话内创建一个变量,$rem1。使用任何适合您的变量名称和标识符字符串。稍后您将使用此变量来确定是否已连接到同一会话。

$rem1 = "same session"

5. 运行下面的命令退出远程 PowerShell 会话。

Exit-PSSession
Disconnecting from a persistent remote session

6. 重新建立远程 PowerShell 会话。

Enter-PSSession $var

7. 在远程会话提示符下执行变量 $rem1,如下所示,以查看其值。

$rem1

你应该在退出远程 PowerShell 会话之前看到之前设置的相同值,以确认你已重新连接到同一会话。

Viewing the value of a session variable

8. 运行Exit-PSSession命令,再次退出会话,如下所示。

Exit-PSSession

9. 最后,执行Invoke-Command,将session开关设置为$var,以在同一远程会话中显示远程计算机的主机名。这种方法是在同一会话中运行命令的替代方式,而无需手动连接、断开连接和重新连接到单个会话。

Invoke-Command -Session $var -ScriptBlock {hostname}
Displaying the hostname of a remote machine

10. 运行Remove-PSSession以完全移除存储在$var中的会话。

Remove-PSSession $var

结论

恭喜!通过完成本教程,你已经学会如何使用远程 PowerShell 管理 Windows 或 Linux 系统。本指南旨在让你初窥门径。为什么不深入学习通过远程会话使用Linux 上的 PowerShell呢?

Source:
https://adamtheautomator.com/remote-powershell/