Удаленное взаимодействие 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
Установите последнюю версию PowerShell. Дополнительные сведения см. в разделе Установка PowerShell в Windows.
Вы можете убедиться, что PowerShell поддерживает удаленное взаимодействие по SSH, перечислив наборы параметров
New-PSSession. Вы заметите, что имена наборов параметров начинаются с SSH. Эти наборы параметров включают параметры SSH.(Get-Command New-PSSession).ParameterSets.NameName ---- 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 EightDotThreeFileNameEightDotThreeFileName --------------------- c:\progra~1При желании включите аутентификацию по ключу:
PubkeyAuthentication yesДополнительные сведения см. в разделе «Управление ключами OpenSSH».
Перезапустите службу sshd.
Restart-Service sshdДобавьте путь, по которому установлен OpenSSH, в переменную среды Path. Например,
C:\Program Files\OpenSSH\. Эта запись позволяет найтиssh.exe.
Установите службу SSH на компьютер с Ubuntu Linux.
Установите последнюю версию PowerShell, см. раздел Установка PowerShell в Ubuntu.
Установите Ubuntu OpenSSH-сервер.
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 включено, выполнив следующие действия:
- Откройте
Настройки системы.
- Откройте
- Нажмите
Общие. - Нажмите
Поделиться. - Установите флажок
Удаленный вход, чтобы включитьУдаленный вход: включен. - Разрешите доступ соответствующим пользователям.
Отредактируйте файл 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 так, чтобы она требовала аутентификации с открытым ключом и одноразового пароля для дополнительной безопасности. Настройка многофакторной аутентификации выходит за рамки этой документации. Обратитесь к документации по 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