Поиск по сайту:

Удаленное взаимодействие PowerShell через SSH


Обзор

Удаленное взаимодействие PowerShell обычно использует WinRM для согласования соединения и транспортировки данных. SSH теперь доступен для платформ Linux и Windows и обеспечивает настоящее многоплатформенное удаленное взаимодействие PowerShell.

WinRM предоставляет надежную модель размещения для удаленных сеансов PowerShell. Удаленное взаимодействие на основе SSH в настоящее время не поддерживает настройку удаленной конечной точки и Just Enough Administration (JEA).

Удаленное взаимодействие SSH позволяет выполнять базовое удаленное взаимодействие сеансов PowerShell между компьютерами под управлением Windows и Linux. Удаленное взаимодействие SSH создает хост-процесс PowerShell на целевом компьютере в качестве подсистемы SSH. Со временем мы реализуем общую модель хостинга, аналогичную WinRM, для поддержки конфигурации конечных точек и JEA.

Командлеты New-PSSession, Enter-PSSession и Invoke-Command теперь имеют новый набор параметров для поддержки этого нового удаленного подключения.

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

Чтобы создать удаленный сеанс, вы указываете целевой компьютер с помощью параметра HostName и указываете имя пользователя с помощью UserName. При интерактивном запуске командлетов вам будет предложено ввести пароль. Вы также можете использовать аутентификацию по ключу SSH, используя файл закрытого ключа с параметром KeyFilePath. Создание ключей для аутентификации SSH зависит от платформы.

Общая информация о настройке

PowerShell 6 или более поздней версии и SSH должны быть установлены на всех компьютерах. Установите клиент SSH (ssh.exe) и сервер (sshd.exe), чтобы можно было удаленно подключаться к компьютерам и обратно. OpenSSH для Windows теперь доступен в Windows 10 сборки 1809 и Windows Server 2019. Дополнительные сведения см. в разделе Управление Windows с помощью OpenSSH. Для Linux установите SSH, включая sshd-сервер, соответствующий вашей платформе. Вам также необходимо установить PowerShell с GitHub, чтобы получить функцию удаленного взаимодействия SSH. Сервер SSH необходимо настроить для создания подсистемы SSH для размещения процесса PowerShell на удаленном компьютере. Кроме того, вам необходимо включить аутентификацию по паролю или ключу.

Установите службу SSH на компьютер с Windows

  1. Установите последнюю версию PowerShell. Дополнительные сведения см. в разделе Установка PowerShell в Windows.

    Вы можете убедиться, что PowerShell поддерживает удаленное взаимодействие по SSH, перечислив наборы параметров New-PSSession. Вы заметите, что имена наборов параметров начинаются с SSH. Эти наборы параметров включают параметры SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Установите последнюю версию Win32 OpenSSH. Инструкции по установке см. в разделе Начало работы с OpenSSH.

    Примечание

    Если вы хотите установить PowerShell в качестве оболочки по умолчанию для OpenSSH, см. раздел Настройка Windows для OpenSSH.

  3. Отредактируйте файл sshd_config, расположенный по адресу $env:ProgramData\ssh.

    Убедитесь, что аутентификация по паролю включена:

    PasswordAuthentication yes
    

    Создайте подсистему SSH, в которой будет размещаться процесс PowerShell на удаленном компьютере:

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

    Примечание

    Начиная с PowerShell 7.4, вам больше не нужно использовать параметр -nologo при запуске PowerShell в режиме SSH-сервера.

    Примечание

    Местоположение исполняемого файла PowerShell по умолчанию — c:/progra~1/powershell/7/pwsh.exe. Местоположение может различаться в зависимости от того, как вы установили PowerShell.

    Вы должны использовать короткое имя 8.3 для всех путей к файлам, содержащих пробелы. В OpenSSH для Windows есть ошибка, которая не позволяет пробелам работать в путях к исполняемым файлам подсистемы. Дополнительные сведения см. в этом выпуске GitHub.

    Короткое имя 8.3 для папки Program Files в Windows обычно — 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.

Установите службу SSH на компьютер с Ubuntu Linux.

  1. Установите последнюю версию PowerShell, см. раздел Установка PowerShell в Ubuntu.

  2. Установите Ubuntu OpenSSH-сервер.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Отредактируйте файл sshd_config по адресу /etc/ssh.

    Убедитесь, что аутентификация по паролю включена:

    PasswordAuthentication yes
    

    При желании включите аутентификацию по ключу:

    PubkeyAuthentication yes
    

    Дополнительную информацию о создании ключей SSH в Ubuntu см. на странице руководства ssh-keygen.

    Добавьте запись подсистемы PowerShell:

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

    Примечание

    Местоположение исполняемого файла PowerShell по умолчанию — /usr/bin/pwsh. Местоположение может различаться в зависимости от того, как вы установили PowerShell.

    Примечание

    Начиная с PowerShell 7.4, вам больше не нужно использовать параметр -nologo при запуске PowerShell в режиме SSH-сервера.

  4. Перезапустите службу ssh.

    sudo systemctl restart sshd.service
    

Установите службу SSH на компьютер MacOS

  1. Установите последнюю версию PowerShell. Дополнительные сведения см. в разделе Установка PowerShell в macOS.

    Убедитесь, что удаленное взаимодействие по SSH включено, выполнив следующие действия:

    1. Откройте Настройки системы.
    2. Нажмите Общие.
    3. Нажмите Поделиться.
    4. Установите флажок Удаленный вход, чтобы включить Удаленный вход: включен.
    5. Разрешите доступ соответствующим пользователям.
  2. Отредактируйте файл sshd_config по адресу /private/etc/ssh/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, вам больше не нужно использовать параметр -nologo при запуске PowerShell в режиме SSH-сервера.

    При желании включите аутентификацию по ключу:

    PubkeyAuthentication yes
    
  3. Перезапустите службу sshd.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

Примечание

При обновлении операционной системы файл конфигурации SSH может быть перезаписан. Обязательно проверьте файл конфигурации после обновления.

Аутентификация

Удаленное взаимодействие PowerShell через SSH основано на обмене аутентификацией между клиентом SSH и службой SSH и не реализует никаких схем аутентификации. В результате любые настроенные схемы аутентификации, включая многофакторную аутентификацию, обрабатываются SSH и не зависят от PowerShell. Например, вы можете настроить службу SSH так, чтобы она требовала аутентификации с открытым ключом и одноразового пароля для дополнительной безопасности. Настройка многофакторной аутентификации выходит за рамки этой документации. Обратитесь к документации по SSH, чтобы узнать, как правильно настроить многофакторную аутентификацию и проверить ее работу вне PowerShell, прежде чем пытаться использовать ее с удаленным взаимодействием PowerShell.

Примечание

Пользователи сохраняют те же привилегии в удаленных сеансах. Это означает, что администраторы имеют доступ к оболочке с повышенными правами, а обычные пользователи — нет.

Пример удаленного взаимодействия PowerShell

Самый простой способ протестировать удаленное взаимодействие — попробовать его на одном компьютере. В этом примере мы создаем удаленный сеанс на том же компьютере с Linux. Мы используем командлеты PowerShell в интерактивном режиме, поэтому видим запросы от 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]

Окна в Windows

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.

  • PSRemoting через SSH не поддерживает профили и не имеет доступа к $PROFILE. Во время сеанса вы можете загрузить профиль, указав полный путь к файлу. Это не связано с профилями SSH. Вы можете настроить SSH-сервер на использование PowerShell в качестве оболочки по умолчанию и загрузку профиля через SSH. Дополнительную информацию смотрите в документации SSH.

  • До версии PowerShell 7.1 удаленное взаимодействие через SSH не поддерживало удаленные сеансы второго перехода. Эта возможность была ограничена сеансами с использованием WinRM. PowerShell 7.1 позволяет Enter-PSSession и Enter-PSHostProcess работать из любого интерактивного удаленного сеанса.

См. также

  • Установка PowerShell в Linux
  • Установка PowerShell на macOS
  • Установка PowerShell в Windows
  • Управление Windows с помощью OpenSSH
  • Управление ключами OpenSSH
  • Ubuntu SSH