Рубрики
Uncategorized

CARKER CRANCE

PowerShell «Remoting» позволяет создать оболочку или выполнять команды на удаленном компьютере. Базалл … Теги с DevOps, PowerShell, сценарием, производительностью.

PowerShell «Remoting» позволяет создать оболочку или выполнять команды на удаленном компьютере. По сути, это эквивалент PowerShell для SSH команда. Существуют определенные аспекты этого, которые чувствуют себя довольно хорошо продуманным и почти романом, которые заставляют его хорошо учиться. Особенно, если ваша среда тяжело на основе Windows.

PowerShell, будучи «родным» к Windows, относительно прост в Windows 10. Требования в основном кипеть до бега Включить-PSREMOTING в админге PowerShell:

Enable-PSRemoting -Force

PowerShell Core Доступен для нескольких платформ, включая Linux и Mac. Но PowerShell Съемка от клиента Linux/Mac к хосту Windows необходимо использовать SSH вместо WinRM. Это требует:

  1. Установите SSHD (демон OpenSSH) на хосте Windows
  2. Испытание PowerShell Remoting
  3. Дополнительная конфигурация
  4. Скопируйте ключ клиента на хост

Большинство из этого происходит от официальных документов на 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 не удалось. Ошибка . Отказ Если это так, установите его вручную:

  1. Скачать Последний выпуск Win32-Openssh
  2. Беги 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

Дополнительные ресурсы

Оригинал: «https://dev.to/jeikabu/powershell-crash-course-remoting-54n1»