当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 通过 SSH 进行 PowerShell 远程处理

作者:精品下载站 日期:2024-12-14 02:58:30 浏览:15 分类:玩电脑

通过 SSH 进行 PowerShell 远程处理


概述

PowerShell 远程处理通常使用 WinRM 进行连接协商和数据传输。 SSH 现在可用于 Linux 和 Windows 平台,并允许真正的多平台 PowerShell 远程处理。

WinRM 为 PowerShell 远程会话提供强大的托管模型。基于 SSH 的远程处理当前不支持远程端点配置和 Just Enough Administration (JEA)。

SSH 远程处理允许您在 Windows 和 Linux 计算机之间执行基本的 PowerShell 会话远程处理。 SSH 远程处理在目标计算机上创建一个 PowerShell 主机进程作为 SSH 子系统。最终我们将实现一个类似于 WinRM 的通用托管模型,以支持端点配置和 JEA。

New-PSSessionEnter-PSSessionInvoke-Command cmdlet 现在具有新的参数集来支持这一新的远程连接。

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

要创建远程会话,请使用 HostName 参数指定目标计算机,并使用 UserName 提供用户名。以交互方式运行 cmdlet 时,系统会提示您输入密码。您还可以使用带有 KeyFilePath 参数的私钥文件进行 SSH 密钥身份验证。创建用于 SSH 身份验证的密钥因平台而异。

一般设置信息

所有计算机上都必须安装 PowerShell 6 或更高版本以及 SSH。安装 SSH 客户端 (ssh.exe) 和服务器 (sshd.exe),以便您可以远程访问和远程访问计算机。适用于 Windows 的 OpenSSH 现已在 Windows 10 build 1809 和 Windows Server 2019 中提供。有关详细信息,请参阅使用 OpenSSH 管理 Windows。对于 Linux,安装适合您的平台的 SSH,包括 sshd 服务器。您还需要从 GitHub 安装 PowerShell 才能获得 SSH 远程处理功能。必须将 SSH 服务器配置为创建 SSH 子系统以在远程计算机上托管 PowerShell 进程。并且,您必须启用密码基于密钥身份验证。

在Windows计算机上安装SSH服务

  1. 安装最新版本的 PowerShell。有关更多信息,请参阅在 Windows 上安装 PowerShell。

    您可以通过列出 New-PSSession 参数集来确认 PowerShell 是否支持 SSH 远程处理。您会注意到有一些以 SSH 开头的参数集名称。这些参数集包括SSH参数。

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. 安装最新的 Win32 OpenSSH。有关安装说明,请参阅 OpenSSH 入门。

    笔记

    如果要将 PowerShell 设置为 OpenSSH 的默认 shell,请参阅为 OpenSSH 配置 Windows。

  3. 编辑位于 $env:ProgramData\sshsshd_config 文件。

    确保启用密码验证:

    PasswordAuthentication yes
    

    创建在远程计算机上托管 PowerShell 进程的 SSH 子系统:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
    

    笔记

    从 PowerShell 7.4 开始,在 SSH 服务器模式下运行 PowerShell 时不再需要使用 -nologo 参数。

    笔记

    PowerShell 可执行文件的默认位置是 c:/progra~1/powershell/7/pwsh.exe。该位置可能会有所不同,具体取决于您安装 PowerShell 的方式。

    对于任何包含空格的文件路径,必须使用 8.3 短名称。 Windows 版 OpenSSH 中存在一个错误,该错误会阻止空格在子系统可执行路径中工作。有关更多信息,请参阅此 GitHub 问题。

    Windows 中 Program Files 文件夹的 8.3 简称通常为 Progra~1。但是,您可以使用以下命令来确保:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    c:\progra~1
    

    (可选)启用密钥身份验证:

    PubkeyAuthentication yes
    

    有关更多信息,请参阅管理 OpenSSH 密钥。

  4. 重新启动 sshd 服务。

    Restart-Service sshd
    
  5. 将 OpenSSH 的安装路径添加到 Path 环境变量中。例如,C:\Program Files\OpenSSH\。此条目允许找到 ssh.exe

在 Ubuntu Linux 计算机上安装 SSH 服务

  1. 安装最新版本的 PowerShell,请参阅在 Ubuntu 上安装 PowerShell。

  2. 安装 Ubuntu OpenSSH 服务器。

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. 编辑位于 /etc/ssh 位置的 sshd_config 文件。

    确保启用密码验证:

    PasswordAuthentication yes
    

    (可选)启用密钥身份验证:

    PubkeyAuthentication yes
    

    有关在 Ubuntu 上创建 SSH 密钥的更多信息,请参阅 ssh-keygen 的联机帮助页。

    添加 PowerShell 子系统条目:

    Subsystem powershell /usr/bin/pwsh -sshs -nologo
    

    笔记

    PowerShell 可执行文件的默认位置是 /usr/bin/pwsh。该位置可能会有所不同,具体取决于您安装 PowerShell 的方式。

    笔记

    从 PowerShell 7.4 开始,在 SSH 服务器模式下运行 PowerShell 时不再需要使用 -nologo 参数。

  4. 重新启动 ssh 服务。

    sudo systemctl restart sshd.service
    

在 macOS 计算机上安装 SSH 服务

  1. 安装最新版本的 PowerShell。有关更多信息,请参阅在 macOS 上安装 PowerShell。

    请按照以下步骤确保启用 SSH 远程处理:

    1. 打开系统设置
  2. 单击常规
  3. 单击共享
  4. 选中远程登录以设置远程登录:打开
  5. 允许适当的用户访问。
  • 编辑位于 /private/etc/ssh/sshd_config 位置的 sshd_config 文件。

    使用文本编辑器,例如 nano

    sudo nano /private/etc/ssh/sshd_config
    

    确保启用密码验证:

    PasswordAuthentication yes
    

    添加 PowerShell 子系统条目:

    Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
    

    笔记

    PowerShell 可执行文件的默认位置是 /usr/local/bin/pwsh。该位置可能会有所不同,具体取决于您安装 PowerShell 的方式。

    笔记

    从 PowerShell 7.4 开始,在 SSH 服务器模式下运行 PowerShell 时不再需要使用 -nologo 参数。

    (可选)启用密钥身份验证:

    PubkeyAuthentication yes
    
  • 重新启动 sshd 服务。

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    
  • 笔记

    升级操作系统时,SSH 配置文件可能会被覆盖。请务必在升级后检查配置文件。

    验证

    通过 SSH 的 PowerShell 远程处理依赖于 SSH 客户端和 SSH 服务之间的身份验证交换,本身不实现任何身份验证方案。结果是任何配置的身份验证方案(包括多重身份验证)均由 SSH 处理,并且独立于 PowerShell。例如,您可以将 SSH 服务配置为需要公钥身份验证和一次性密码以增加安全性。多重身份验证的配置超出了本文档的范围。请参阅 SSH 文档,了解如何正确配置多重身份验证,并在尝试将其与 PowerShell 远程处理一起使用之前验证其在 PowerShell 之外是否正常工作。

    笔记

    用户在远程会话中保留相同的权限。这意味着,管理员可以访问提升的 shell,而普通用户则不能。

    PowerShell 远程处理示例

    测试远程处理的最简单方法是在一台计算机上进行尝试。在此示例中,我们创建一个与同一台 Linux 计算机的远程会话。我们以交互方式使用 PowerShell cmdlet,因此我们会看到 SSH 的提示,要求验证主机并提示输入密码。您可以在 Windows 计算机上执行相同的操作,以确保远程处理正常工作。然后,通过更改主机名在计算机之间进行远程。

    Linux 到 Linux

    $session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
    
    The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
    ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
    Are you sure you want to continue connecting (yes/no)?
    TestUser@UbuntuVM1s password:
    
    $session
    
     Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
     -- ----   ------------    ------------    -----    -----------------     ------------
      1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
    
    Enter-PSSession $session
    
    [UbuntuVM1]: PS /home/TestUser> uname -a
    Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    
    [UbuntuVM1]: PS /home/TestUser> Exit-PSSession
    
    Invoke-Command $session -ScriptBlock { Get-Process pwsh }
    
    Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
    -------  ------    -----      -----     ------     --  -- -----------    --------------
          0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
          0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
          0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1
    

    Linux 到 Windows

    Enter-PSSession -HostName WinVM1 -UserName PTestName
    
    PTestName@WinVM1s password:
    
    [WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
    
    Microsoft Windows [Version 10.0.10586]
    

    窗口到窗口

    C:\Users\PSUser\Documents>pwsh.exe
    
    PowerShell
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    $session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
    
    The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
    ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
    Are you sure you want to continue connecting (yes/no)?
    Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
    PSRemoteUser@WinVM2's password:
    
    $session
    
     Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
     -- ----            ------------    ------------    -----         -----------------     ------------
      1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
    
    Enter-PSSession -Session $session
    
    [WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable
    
    Name                           Value
    ----                           -----
    PSEdition                      Core
    PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
    SerializationVersion           1.1.0.1
    BuildVersion                   3.0.0.0
    CLRVersion
    PSVersion                      6.0.0-alpha
    WSManStackVersion              3.0
    PSRemotingProtocolVersion      2.3
    GitCommitId                    v6.0.0-alpha.17
    
    
    [WinVM2]: PS C:\Users\PSRemoteUser\Documents>
    

    局限性

    • sudo 命令在 Linux 计算机的远程会话中不起作用。

    • 通过 SSH 的 PSRemoting 不支持配置文件,并且无权访问 $PROFILE。进入会话后,您可以通过使用完整文件路径点获取配置文件来加载配置文件。这与 SSH 配置文件无关。您可以将 SSH 服务器配置为使用 PowerShell 作为默认 shell 并通过 SSH 加载配置文件。有关详细信息,请参阅 SSH 文档。

    • 在 PowerShell 7.1 之前,通过 SSH 进行远程处理不支持第二跳远程会话。此功能仅限于使用 WinRM 的会话。 PowerShell 7.1 允许 Enter-PSSessionEnter-PSHostProcess 在任何交互式远程会话中工作。

    参见

    • 在 Linux 上安装 PowerShell
    • 在 macOS 上安装 PowerShell
    • 在 Windows 上安装 PowerShell
    • 使用 OpenSSH 管理 Windows
    • 管理 OpenSSH 密钥
    • Ubuntu SSH

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯