Подробное руководство для начинающих по удаленному PowerShell

Вы когда-нибудь хотели выполнять команды PowerShell на удаленной машине, находясь в уюте своей рабочей станции? Ну, с помощью PowerShell Remoting вы можете. С удаленным PowerShell вы можете выполнять команды и сценарии на нескольких удаленных системах устойчивым способом.

Звучит интересно? Читайте дальше, чтобы узнать, как приручить эти удаленные машины с помощью PowerShell.

Предварительные требования

Этот учебник будет практическим демонстрационным. Если вы хотите следовать за мной, убедитесь, что у вас есть как минимум три компьютера с PowerShell 7. Один будет вашим управляющим компьютером, а два других будут удаленными машинами.

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

  • A Windows 10 PC with PowerShell 7 installed as the management computer. You will launch remote commands from this machine.
  • A Windows 10 PC with PowerShell 7 installed. This machine will be the endpoint for remote PowerShell over WinRM.
    • A user account on the remote Windows machine with local administrator rights. This tutorial uses a user account called ma.
  • Машина с Linux с включенным SSHD для обслуживания в качестве удаленной конечной точки PowerShell через SSH. В этом руководстве используется Fedora 35.
    • Учетная запись пользователя для выполнения удаленных команд на машине с Linux. Учетная запись должна иметь sudo и доступ по SSH. В этом руководстве используется учетная запись с именем test. Создайте учетную запись пользователя на этом этапе, если у вас ее нет на машине с Linux.

Включение удаленного PowerShell на Windows через WinRM

При установке PowerShell 7 есть опция включения удаленного PowerShell, и вы, возможно, включили его тогда. Однако, чтобы быть уверенным, следуйте нижеприведенным шагам для включения удаленного PowerShell.

1. Войдите на удаленный компьютер с Windows 10.

2. Откройте PowerShell с правами администратора.

3. Запустите следующую команду для включения удаленного PowerShell.

Enable-PSRemoting

Команда выполняет несколько изменений конфигурации, которые вы увидите в консоли.

Enabling Remote PowerShell on Windows over WinRM

Включение удаленного PowerShell на Linux через SSH

WinRM является эксклюзивным для Windows, что означает, что вы не можете включить удаленный PowerShell на Linux с его помощью. Вместо этого вы можете включить удаленный PowerShell через SSH на Linux. Предполагается, что вы уже установили PowerShell, следуйте приведенным ниже шагам.

1. Войдите в свою удаленную систему Linux и откройте сеанс терминала.

2. Откройте файл конфигурации SSH-сервера в текстовом редакторе. Используйте свой выбор текстового редактора, такого как Gedit, Sublime или Nano. В этом примере используется Gedit.

sudo nano /etc/ssh/sshd_config

3. Затем добавьте следующую строку в файл. Эта строка создает подсистему SSH, которая запускает процесс PowerShell.

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Create an SSH subsystem for PowerShell on Linux

4. Закройте редактор.

5. Наконец, перезапустите SSH-сервер, выполнив следующую команду.

sudo systemctl restart sshd

Добавление доверенных хостов удаленного PowerShell на локальной машине

На этом этапе ваш удаленный компьютер готов принимать команды. Однако ваш компьютер управления может отказаться подключаться к хостам удаленного PowerShell, если они не включены в список доверенных хостов. Чтобы избежать возможных проблем с удаленным управлением, вы должны добавить удаленные хосты в свои Доверенные хосты.

Откройте PowerShell с правами администратора на вашем компьютере управления.

Запустите нижеследующую команду winrm. Эта команда добавляет ваши удаленные машины Windows (192.168.8.107) и Linux (192.168.8.171) в список доверенных хостов вашего компьютера.

winrm set winrm/config/client '@{TrustedHosts=" 192.168.8.171,192.168.8.107"}'
Adding remote machines as Trusted Hosts

Запуск команд на удаленных компьютерах

Со всеми необходимыми компонентами вы будете выполнять команды на удаленной машине в этом разделе.

1. Откройте новую сессию PowerShell на вашем управляющем компьютере.

2. Теперь выполните нижеследующую команду Invoke-Command, чтобы вывести список первых пяти служб на удаленной машине от имени пользователя ma. Команда к запуску находится между фигурными скобками параметра ScriptBlock, как показано ниже.

Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Windows host

3. Чтобы выполнить то же самое на удаленном хосте Linux, запустите вместо этого нижеследующую команду. Обратите внимание, что -HostName заменяет -ComputerName, а -UserName заменяет -ComputerName. Эти параметры указывают командлету Invoke-Command, что цель – хост SSH.

Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -ScriptBlock { Get-Process | Select-Object -First 5 }
Listing the processes on the remote PowerShell Linux host

Выполнение сценариев на удаленных компьютерах

Вы также можете запустить файл сценария PowerShell на удаленном компьютере с помощью командлета Invoke-Command. Но вместо указания параметра -ScriptBlock вы укажете параметр -FilePath, за которым следует локальный путь к сценарию.

1. Сначала создайте файл сценария PowerShell под названием nametime.ps1 на вашем локальном компьютере.

2. Откройте сценарий в вашем предпочтительном редакторе сценариев и добавьте следующий код. После этого сохраните файл.

# nametime.ps1
hostname
Get-Date
Create the PowerShell script

3. Выполните cmdlet Invoke-command с параметром -FilePath. Параметр -FilePath должен указывать на файл сценария. В этом примере файл сценария находится в том же рабочем каталоге.

# Вызов сценария в удаленном PowerShell через WinRM
Invoke-Command `
    -ComputerName 192.168.8.107 `
    -Credential 'ma' `
    -FilePath .\nametime.ps1

# Вызов сценария в удаленном PowerShell через SSH
Invoke-Command `
    -HostName 192.168.8.171 `
    -UserName 'test' `
    -FilePath .\nametime.ps1
Invoke a script on remote PowerShell hosts

Управление удаленным компьютером в интерактивном режиме

На предыдущем этапе вы увидели, как выполнять отдельные команды на удаленной машине. В этом разделе вы узнаете, как открыть интерактивную сессию, чтобы выполнять несколько команд на удаленной машине, как если бы это было локально.

1. Выполните команду Enter-PSSession для запуска удаленной сессии на машине с IP-адресом 192.168.8.107 от имени пользователя ma.

Enter-PSSession -ComputerName 192.168.8.107 -Credential ma

Введите пароль для учетной записи удаленного пользователя, ma, как показано ниже.

Entering an interactive remote session

Вы увидите новый приглашение, как показано ниже. IP-адрес в квадратных скобках указывает на удаленный хост PowerShell.

Viewing a remote prompt

3. Выведите список файлов в текущем рабочем каталоге с помощью команды dir, как показано ниже. Вы можете выполнять столько команд PowerShell, сколько вам нужно в рамках сеанса dir

dir

Содержимое каталога должно отображаться на вашем экране, как на скриншоте ниже.

Linting the files on a remote machine

4. Выполните cmdlet Exit-PSSession ниже, чтобы завершить сеанс после завершения управления удаленной машиной.

Exit-PSSession

После выхода вы должны вернуться к локальному приглашению, как показано на скриншоте ниже.

Exiting a remote session

Отключение и повторное подключение удаленных сеансов PowerShell

Возможно сохранение сеанса постоянно как альтернативы интерактивным сеансам или одноразовым командам. Сохранение сеанса позволяет вам переключаться между сеансами, не теряя контекста. В этом разделе вы узнаете, как создавать и управлять постоянными сеансами.

1. Запустите командлет New-PSSession, чтобы создать сеанс на удаленном компьютере, 192.168.8.107, от имени пользователя ma (-Credential). Сохраните сеанс в переменной $var, следуя этим шагам.

$var = New-PSSession -ComputerName 192.168.8.107 -Credential ma

2. Выполните переменную $var, чтобы просмотреть ее содержимое, как показано ниже

$var

Как показано ниже, вы должны увидеть объект сеанса с Тип компьютера RemoteMachine и Состояние, установленными на Открыт.

Displaying the details of a session

3. Запустите команду Enter-PSSession, чтобы войти в сеанс, сохраненный в $var.

Enter-PSSession $var

Если все в порядке, приглашение изменится на удаленное приглашение без дополнительного вывода, как показано ниже.

Entering a persistent remote session

4. Создайте переменную,$rem1, внутри сеанса. Используйте любое имя переменной и строку идентификатора, которые вам подходят. Вы будете использовать эту переменную позже, чтобы определить, подключены ли вы к тому же сеансу.

$rem1 = "same session"

5. Выполните следующую команду, чтобы выйти из удаленного сеанса PowerShell.

Exit-PSSession
Disconnecting from a persistent remote session

6. Восстановите удаленный сеанс PowerShell.

Enter-PSSession $var

7. Выполните переменную $rem1 на пригласительном экране удаленного сеанса, как показано ниже, чтобы просмотреть ее значение.

$rem1

Вы должны увидеть тот же самый результат, который вы установили ранее, перед тем как завершить удаленную сессию PowerShell, подтверждая, что вы подключились к той же самой сессии.

Viewing the value of a session variable

8. Выполните команду Exit-PSSession, чтобы снова выйти из сеанса следующим образом.

Exit-PSSession

9. Наконец, выполните Invoke-Command с переключателем session, установленным на $var, чтобы отобразить имя хоста удаленной машины в той же удаленной сессии. Этот метод является альтернативным способом выполнения команд в той же самой сессии без ручного подключения, отключения и повторного подключения к одной сессии.

Invoke-Command -Session $var -ScriptBlock {hostname}
Displaying the hostname of a remote machine

10. Выполните команду Remove-PSSession, чтобы полностью удалить сессию, хранящуюся в $var.

Remove-PSSession $var

Заключение

Поздравляем! Дойдя до конца этого руководства, вы научились управлять системой Windows или Linux с помощью удаленного PowerShell. Это руководство призвано познакомить вас с основами. Почему бы не погрузиться глубже с PowerShell на Linux через удаленную сессию?

Source:
https://adamtheautomator.com/remote-powershell/