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

Использование удаленного взаимодействия PowerShell через SSH


В классических версиях Windows PowerShell (до 5.1) для доступа к удаленным компьютерам с помощью PSRemoting можно было использовать только протокол WinRM (WSMan, порт 5985/5986). В новых кроссплатформенных версиях PowerShell Core 7.x и 6.x вы можете использовать SSH для удаленного взаимодействия PowerShell между компьютерами. Давайте попробуем настроить PSRemoting через SSH для подключения к хостам Windows, Linux или macOS.

Включить удаленное взаимодействие SSH PowerShell в Windows

Давайте посмотрим, как настроить SSH-сервер на стороне клиента Windows для включения удаленного взаимодействия PowerShell.

Сначала включите встроенный сервер OpenSSH в Windows 10 (версия 1809 или новее) и Windows Server 2019. Установите SSH-сервер с помощью следующей команды (в Windows 10 или 11):

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Также установите последнюю версию PowerShell Core:

iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"

Затем включите автоматический запуск службы sshd с помощью командлетов PowerShell управления службами:

Set-Service -Name sshd -StartupType 'Automatic'
Start-Service sshd

Убедитесь, что Windows теперь прослушивает порт TCP/22 (SSH):

Get-NetTCPConnection -State Listen|where {$_.localport -eq '22'}

Разрешите входящие SSH-соединения в брандмауэре Защитника Windows:

Enable-NetFirewallRule -Name *OpenSSH-Server*

Затем откройте файл конфигурации C:\ProgramData\ssh\sshd_config:

notepad $Env:ProgramData\ssh\sshd_config

Включите аутентификацию по паролю SSH, раскомментировав следующую строку:

PasswordAuthentication yes

Вы также можете разрешить доступ по SSH с помощью ключей:

PubkeyAuthentication yes

Добавьте строку ниже в файл. Он запустит интерпретатор pwsh.exe для удаленных подключений SSH:

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

Сохраните файл sshd_config и перезапустите службу sshd:

restart-service sshd

Как включить удаленное взаимодействие PowerShell SSH в Linux?

Теперь давайте посмотрим, как настроить хост Linux для удаленного взаимодействия PowerShell через SSH.

Установите PowerShell Core в свой дистрибутив Linux согласно этому руководству. Я использую следующие команды для своего хоста Ubuntu 20.04:

$ sudo apt-get update -y
$ wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ sudo apt-get update
$ sudo apt-get install powershell -y

Установите сервер OpenSSH (если он не установлен):

$ sudo apt install openssh-server

Добавьте строки ниже в /etc/ssh/sshd_config:

PasswordAuthentication yes
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

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

sudo systemctl restart sshd.service

P.S.Управление по SSH с примерами

Теперь вы можете подключиться к настроенному хосту Windows или Linux с помощью PowerShell через SSH. Для доступа к удаленным компьютерам по SSH используются те же командлеты, что и в WinRM:

  • New-PSSession
  • Enter-PSSession

    - установить интерактивный сеанс PowerShell с удаленным хостом

  • Invoke-Command

    - для удаленного запуска команд или скриптов PS1

По умолчанию эти командлеты пытаются использовать WinRM для подключения к удаленным компьютерам. Чтобы использовать транспорт SSH, вам следует использовать другие варианты подключения (доступные в PowerShell Core, поэтому вам придется запускать их из

 pwsh.exe

быстрый).

Параметры -HostName (вместо -ComputerName) и -UserName (вместо -Credential) позволяют указать имя компьютера и пользователя для SSH-соединения. С помощью параметра -KeyFilePath вы можете указать ключи SSH для аутентификации (необязательно). Вы также можете использовать параметр -SSHTransport, чтобы явно включить SSH-транспорт для трафика PowerShell.

Попробуем подключиться к удаленному компьютеру в интерактивном режиме из Windows с помощью встроенного SSH-клиента:

Enter-PSSession -HostName 192.168.50.20 -UserName maxbak

Для подключения достаточно подтвердить SSH-отпечаток сервера и ввести пароль пользователя, которому разрешено удаленное подключение.

Вы можете создать несколько постоянных сеансов PowerShell для удаленных компьютеров и выполнять на них команды через SSH:

$session1 = New-PSSession -HostName 192.168.50.20 -UserName maxbak -SSHTransport
$session2 = New-PSSession -HostName 192.168.54.44 -UserName root -SSHTransport

Чтобы запустить команду на нескольких компьютерах одновременно, используйте команду ниже:

Invoke-Command -Session $session1, $session2 -ScriptBlock { $PSVersionTable| select OS, PSVersion}| Select-Object PSComputerName, PSVersion, OS

В этом примере мы запустили команду на компьютере с Windows и Linux и отобразили вывод в консоли.

В PowerShell Core 7.1 и более поздних версиях PSRemoting поддерживает двойной переход к другому удаленному компьютеру из существующего сеанса.

В этой опции вы можете указать несколько сеансов SSH и пройти аутентификацию с использованием ключей RSA:

$sshConnections = @{HostName="winsrv1"; UserName="active-directory\maxbak"; KeyFilePath="c:\users\maxbak\id_rsa" }, @{ HostName="root@ubunsrv1"; KeyFilePath="c:\vault\ubunsrv1_id_rsa" }
New-PSSession -SSHConnection $sshConnections

Ключевые ограничения удаленного взаимодействия PowerShell через SSH:

  • Профили PowerShell не поддерживаются;

  • В удаленных сеансах с хостами Linux sudo не поддерживается (при запуске появляется следующая ошибка:

    sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper

    );

  • Just Enough Administration (JEA) не поддерживается.

Как видите, настроить PowerShell Remoting через SSH гораздо проще, чем через WinRM HTTPS. Кроме того, вы можете использовать этот метод подключения для подключения к компьютерам в рабочей группе с помощью PowerShell, не добавляя их в TrustedHost.

PowerShell Remoting через SSH — безопасная и простая альтернатива WinRM. PSУдаленное взаимодействие через SSH поддерживается на любой платформе (Windows, Linux, macOS), открываются любые дополнительные порты (кроме TCP/22 SSH) и легко настраивается.

Статьи по данной тематике