Удаленное взаимодействие с PowerShell через SSH
Обзор
Функция удаленного взаимодействия PowerShell обычно использует WinRM для согласования соединения и передачи данных. Теперь протокол SSH доступен на платформах Linux и Windows, что позволяет осуществлять многоплатформенное удаленное взаимодействие с PowerShell.
Служба удаленного управления Windows обеспечивает надежную модель поддержки удаленных сеансов PowerShell. Удаленное взаимодействие по протоколу SSH сейчас не поддерживает настройку удаленных конечных точек и функцию JEA (Just Enough Administration).
Удаленное взаимодействие по SSH позволяет осуществлять базовое удаленное взаимодействие между компьютерами с Windows и Linux в рамках сеансов PowerShell. Функция удаленного взаимодействия по SSH создает хост-процесс PowerShell на целевом компьютере в качестве подсистемы SSH. Со временем для поддержки настройки удаленных конечных точек и функции JEA мы реализуем общую модель размещения, похожую на службе удаленного управления Windows.
Командлеты New-PSSession
, Enter-PSSession
и Invoke-Command
теперь имеют набор новых параметров для поддержки этой возможности удаленного взаимодействия.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Чтобы создать удаленный сеанс, укажите целевой компьютер с помощью параметра HostName и имя пользователя с помощью параметра UserName. При интерактивном выполнении командлетов отображается запрос на ввод пароля. Вы также можете использовать проверку подлинности ключа SSH с помощью файла закрытого ключа с параметром KeyFilePath. Способ создания ключей для проверки подлинности по протоколу SSH зависит от платформы.
Общие сведения об установке
PowerShell 6 или более поздней версии, и на всех компьютерах должен быть установлен SSH. Установите клиент (ssh.exe
) и сервер (sshd.exe
) SSH, чтобы осуществлять удаленное взаимодействие между компьютерами. Решение OpenSSH для Windows теперь доступно в Windows 10 сборки 1809 и Windows Server 2019. Дополнительные сведения см. в статье Управление Windows через OpenSSH. В Linux нужно реализовать поддержку SSH (включая установку сервера sshd) в соответствии с используемой платформой. Также для поддержки удаленного взаимодействия по SSH нужно установить PowerShell с сайта GitHub.
Для сервера SSH нужно настроить возможность создать подсистему SSH для размещения процесса PowerShell на удаленном компьютере. Также нужно активировать проверку подлинности на основе пароля или ключа.
Установка службы SSH на компьютере Windows
Установите последнюю версию PowerShell. Дополнительные сведения см. в статье Установка PowerShell в Windows.
Чтобы убедиться, что в PowerShell есть поддержка удаленного взаимодействия SSH, перечислите наборы параметров
New-PSSession
. Обратите внимание на наличие имен наборов параметров, начинающихся с SSH. К этим наборам параметров относятся параметры SSH.(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Установите последнюю версию Win32 OpenSSH. Инструкции по установке см. в разделе Начало работы с OpenSSH.
Примечание.
Если вы хотите задать PowerShell в качестве оболочки по умолчанию для OpenSSH, см. раздел Настройка Windows для OpenSSH.
Измените файл
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.
Перезапустите службу sshd.
Restart-Service sshd
Добавьте путь установки OpenSSH в свою переменную среды Path. Например,
C:\Program Files\OpenSSH\
. Это позволит найти файлssh.exe
.
Установка службы SSH на компьютере Ubuntu Linux
Установите последнюю версию PowerShell, см. статью "Установка PowerShell в Ubuntu".
Установите сервер OpenSSH для Ubuntu.
sudo apt install openssh-client sudo apt install openssh-server
Измените файл
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.Перезапустите службу ssh.
sudo systemctl restart sshd.service
Установка службы SSH на компьютере macOS
Установите последнюю версию PowerShell. Дополнительные сведения об установке PowerShell в macOS.
Убедитесь, что удаленное взаимодействие SSH включено, выполните следующие действия:
- Открыть
System Settings
. - Щелкните
General
- Нажмите
Sharing
. - Установите флажок
Remote Login
, чтобы задатьRemote Login: On
. - Разрешите доступ соответствующим пользователям.
- Открыть
Измените файл
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
Перезапустите службу sshd.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Примечание.
При обновлении операционной системы файл конфигурации SSH может быть перезаписан. Убедитесь, что после обновления проверка файл конфигурации.
Проверка подлинности
При удаленном взаимодействии с PowerShell через SSH используется обмен данными для проверки подлинности между клиентом SSH и службой SSH. Схемы проверки подлинности в его рамках не реализуются. Это означает, что любые настроенные схемы проверки подлинности, включая многофакторную проверку подлинности, обрабатываются протоколом SSH независимо от PowerShell. Например, в службе SSH можно настроить обязательное применение проверки подлинности на основе открытых ключей, а также разовых паролей для усиления безопасности. Настройка многофакторной проверки подлинности выходит за рамки настоящего документа. Сведения о том, как правильно настроить многофакторную проверку подлинности и проверить ее работу вне PowerShell, прежде чем пытаться использовать ее для удаленного взаимодействия с PowerShell, см. в документации по SSH.
Примечание.
Пользователи сохраняют те же привилегии в удаленных сеансах. Это означает, что Администратор istrator имеют доступ к оболочке с повышенными привилегиями, а обычные пользователи не имеют доступа.
Пример удаленного взаимодействия 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 в 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