PowerShell «Remoting» позволяет создать оболочку или выполнять команды на удаленном компьютере. По сути, это эквивалент PowerShell для SSH
команда. Существуют определенные аспекты этого, которые чувствуют себя довольно хорошо продуманным и почти романом, которые заставляют его хорошо учиться. Особенно, если ваша среда тяжело на основе Windows.
PowerShell, будучи «родным» к Windows, относительно прост в Windows 10. Требования в основном кипеть до бега Включить-PSREMOTING в админге PowerShell:
Enable-PSRemoting -Force
PowerShell Core Доступен для нескольких платформ, включая Linux и Mac. Но PowerShell Съемка от клиента Linux/Mac к хосту Windows необходимо использовать SSH вместо WinRM. Это требует:
- Установите SSHD (демон OpenSSH) на хосте Windows
- Испытание PowerShell Remoting
- Дополнительная конфигурация
- Скопируйте ключ клиента на хост
Большинство из этого происходит от официальных документов на Openssh Установка и SSH Remoting Отказ
Установите SSHD на хосте Windows
Все здесь нужно сделать как админ .
Get-WindowsCapability -Online | ? Name -like 'OpenSSH*' # Install listed `OpenSSH.Server ~~~~ X.X.X.X`. E.g.: Add-WindowsCapability -Online -Name OpenSSH.Server ~~~~ 0.0.1.0
В зависимости от вашей среды вы можете получить: Add-windowscapability не удалось. Ошибка
. Отказ Если это так, установите его вручную:
- Скачать Последний выпуск Win32-Openssh
- Беги
install-sshd.ps1.
Редактировать $ env: programdata \ ssh \ sshd_config
:
# Uncomment the following PasswordAuthentication yes PubkeyAuthentication yes # Add the following Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile
Обратите внимание на использование 8,3 пути, чтобы избежать пробелов на счет этот вопрос Отказ Чтобы проверить имя 8.3:
Get-CimInstance Win32_Directory -Filter | Select-Object EightDotThreeFileName
Наконец, перезапустите SSHD:
Restart-Service sshd
Испытание PowerShell Remoting
От Mac/Linux PowerShell:
Enter-PSSession WindowsHostnameOrIP
Если это не удается с:
Enter-PSSession: This parameter set requires WSMan, and no supported WSMan client library was found. WSMan is either not installed or unavailable for this system.
Явно используйте SSH или попробуйте Оборудование установки старой версии OpenSSL :
Enter-PSSession WindowsHostnameOrIP -SSHTransport
Он также работает от SH/Bash/ZSH/et al. Но это, вероятно, приводит к cmd.exe
Shell на удаленном хосте Windows:
ssh WindowsUsername@WindowsHostnameOrIP # Or, if client/host usernames are the same ssh WindowsHostnameOrIP
Дополнительная конфигурация
Когда вы SSH в хосте Windows, оболочка по умолчанию — cmd.exe.
* дрожание * Отказ Чтобы изменить оболочку по умолчанию в PowerShell Настройте SSHD на хосте Windows :
# Again, 8.3 path to executable New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "c:/progra~1/powershell/7/pwsh.exe" -PropertyType String -Force
Чтобы избежать необходимости указывать WindowsUsername @ .....
С SSH вы можете установить по умолчанию для каждого хоста в ~/.ssh/config
на Linux/Mac:
Host WindowsHostnameOrIP HostName WindowsHostnameOrIP User WindowsUsername
Скопируйте клиентский открытый ключ для размещения
Технически это необязательно, но аутентификация на основе ключей слишком удобна для пропуска. Мы предполагаем, что вы уже сгенерировали ключевую пару на клиенте с SSH-Keygen
Отказ Затем вы можете следовать за Документы PowerShell для развертывания ключа Отказ
Скопируйте клиентский открытый ключ к хосту (NB: используйте односмысленные кавычки, чтобы избежать расширения локальных оболочек переменных и заменить id_rsa.pub
С именем вашего открытого ключа):
# If Windows host doesn't already have `authorized_keys` file scp $HOME/.ssh/id_rsa.pub WindowsHostnameOrIP:"C:\Users\WindowsUsername\.ssh\authorized_keys" # OR, if default Windows SSH shell is Powershell, you can append to the existing file or create it: ssh WindowsHostnameOrIP '$Input | Add-Content $env:Home/.ssh/authorized_keys' < $HOME/.ssh/id_rsa.pub # For completeness; for Linux/Mac hosts: ssh-copy-id HostnameOrIP # OR ssh HostnameOrIP 'cat >> $HOME/.ssh/authorized_keys' < $HOME/.ssh/id_rsa.pub
В вышеизложенном, $ Ввод
это Автоматическая переменная содержащий stdin (из <$ HOME/.ssh/id_rsa.pub
).
Тест Вы можете подключиться к клиенту Linux/Mac к хосту Windows без ввода пароля:
# In Linux/Mac PowerShell Enter-PSSession WindowsHostnameOrIP -SSHTransport # OR ssh WindowsHostnameOrIP
Есть несколько хороших обзоров документов на командам удаления:
Получить учетные данные Позволяет вам получить пользовательские учетные данные например Когда не Использование SSH для аутентификации:
$cred = Get-Credential -UserName domain\username
Это наиболее полезно при удалении между клиентом Windows и Host. Это может быть передано большинству команд ниже, добавив -Креденциальный $ Cred
Отказ
При использовании SSH и не используя аутентификацию на основе ключей или не требую другого имени пользователя, большинство команд ниже также принимают -Узнайте имя пользователя
аргумент
Enter-Pssession Создает интерактивное соединение, дающее вам оболочку на хосте. Это сопоставимо с SSH-ING в машину:
Enter-PSSession WindowsHostnameOrIP # OR, if required by Linux/Mac client, explicitly specify to use SSH Enter-PSSession WindowsHostnameOrIP -SSHTransport # Leave the interactive session Exit-PSSession # OR
Пример:
PS /Users/mac_user> Enter-PSSession win_hostname -SSHTransport [win_hostname]: PS C:\Users\win_user\Documents>
Insoke-command Может использоваться для запуска команд или скриптов на одном или нескольких хостах:
# Execute command `Hostname` on host Invoke-Command -ComputerName hostname -ScriptBlock { Hostname } Invoke-Command -SSHTransport -HostName hostname -ScriptBlock { Hostname } # Execute multiple commands on host Invoke-Command -SSHTransport -HostName hostname -ScriptBlock { Hostname; Get-Date } # Run remote script on host Invoke-Command -ComputerName hostname -ScriptBlock { c:\path\remote.ps1 } Invoke-Command -SSHTransport -HostName hostname -ScriptBlock { c:\path\remote.ps1 } # Run local script on host Invoke-Command -FilePath ./local.ps1 -ComputerName hostname Invoke-Command -FilePath ./local.ps1 -SSHTransport -HostName hostname # Execute command `Hostname` on multiple hosts Invoke-Command -ComputerName hostname0, hostname1 -ScriptBlock { Hostname } Invoke-Command -SSHTransport -HostName hostname0, hostname1 -ScriptBlock { Hostname } # You can likewise run local/remote scripts on multiple hosts
Дополнительная информация о Скриптблок .
НОВЫЙ ПССЕССИЯ Создает «постоянное» соединение, которое может повторно использовать для запуска нескольких удаленных команд:
# Create session to host $session = New-PSSession -ComputerName hostname $session = New-PSSession -SSHTransport -HostName hostname # List sessions Get-PSSession # Re-use session to run multiple commands/scripts Invoke-Command -Session $session -ScriptBlock { Hostname } Invoke-Command -Session $session -ScriptBlock { Hostname; $d = Get-Date } # Variables are created in each session and can subsequently be reused Invoke-Command -Session $session -ScriptBlock { $d; c:\path\remote.ps1 } Invoke-Command -Session $session -FilePath ./local.ps1 # Create session to multiple hosts $session2 = New-PSSession -SSHTransport -HostName hostname1, hostname2 # Use multiple single-host sessions Invoke-Command -Session $session,$session -ScriptBlock { Hostname } # Use multiple multi-host sessions Invoke-Command -Session ($session2+$session) -ScriptBlock { Hostname }
Это последний сложно. НОВЫЙ ПССЕССИЯ
С помощью одного хоста возвращается A PSSession
, но с несколькими хозяевами возвращает Объект []
(Массив PSSession
S). Вам придется объединить их в противном случае, потерпев неудачу с Не может конвертировать систему. Объект [] к системе типа. Управление. Автоматизация. Runspaces. ПСSession 'требуется по параметру «сеанс»
Отказ
Переменные
Использование Удаленный против местных переменных удивительно безболезненно. Чтобы использовать локальную переменную префикс имени с $ Использование:
, в противном случае это удалено:
Invoke-Command -Session $session -ScriptBlock { $home; $using:home } # Output C:\Users\win_user /Users/mac_user
Дополнительные ресурсы
- PowerShell Съемка от MacOS на Windows Server
- PowerShell 7 RSA Keys SSH Remoting
Оригинал: «https://dev.to/jeikabu/powershell-crash-course-remoting-54n1»