Главная

Sunday, 12 May 2024

Кросс-платформенное удалённое управление в Powershell.


Всем привет.

В своей практике мы осознали, что создатели PowerShell слегка ленивы, и это хорошо. Поскольку они не хотели кодировать параметр -HostName для каждого отдельного командлета, они создали систему удалённого взаимодействия, охватывающую всю оболочку. Данная система позволяет запускать любой командлет в удалённом компьютере. На самом деле, вы даже можете запускать команды, которые имеются в самом удалённом компьютере, но при этом отсутствуют в вашем собственном, то есть вам не всегда необходимо устанавливать все административные командлеты в своей рабочей станции. Такая система удалённого взаимодействия мощная и предлагает интересные административные возможности.

Основная мысль за удалённым PowerShell

Удалённое взаимодействие PowerShell работает схожим образом с Telnet и прочими древними технологиями удалённого управления. Когда вы запускаете некую команду, она исполняется в самом удалённом компьютере - обратно в ваш компьютер приходят лишь получаемые результаты этой команды.

Удалённое взаимодействие на устройствах Windows

PowerShell применяет протокол взаимодействия с названием Web Services for Management (WSMan). WSMan работает целиком поверх HTTP или HTTPS (HTTP по умолчанию), упрощая маршрутизацию через межсетевые экраны в случае их необходимости (поскольку каждый из таких протоколов пользуется для взаимодействия единственным портом). Реализация Microsoft для WSMаn поступает в виде службы в фоновом режиме, Windows Remote Management (WinRM). WinRM по умолчанию устанавливается в устройствах Windows 10, а также в сервере 2012 и выше. По умолчанию, эти службы отключены, но запросто могут включаться индивидуально или групповой политикой.

Удалённое взаимодействие на устройствах macOS и Linux

Как вы могли догадаться, WSMan и WinRM это службы только для Windows. Поэтому, чтобы PowerShell обладал возможностями удалённого взаимодействия, его команда приняла решение что было бы лучше воспользоваться стандартном отрасли Безопасной оболочки (SSH, Secure Shell)/ SSH упрощает маршрутизацию через межсетевые экраны, в случае такой необходимости (потому как этот протокол применяет для взаимодействия единственный порт), и десятилетиями применялся профессионалами Linux. Microsoft портировал в Windows OpenSSH, а потому вы даже можете применять его для удалённого взаимодействия в Windows.

Кросс-платформенное удалённое взаимодействие

Вы уже изучили что все командлеты PowerShell в качестве своего вывода производят объекты. Когда вы выполняете некую удалённую команду, она выдаёт объекты, которые необходимо поместить в некий вид, который запросто передаётся через сетевую среду. Как оказалось, XML - отличный способ для осуществления этого, а потому PowerShell автоматически такие объекты вывода выстраивает в последовательную форму (упорядочение, serializes) в XML. Данный XML передаётся через сетевую среду и затем в вашем компьютере выполняется обратное преобразование в параллельную форму (развёртывание, deserialized) в объекты, с которыми вы можете работать внутри PowerShell.

Упорядочение и развёртывание это всего лишь некий вид преобразования формата: из объектов в XML (упорядочение) и из XML в объекты (развёртывание). Зачем вам беспокоиться относительно того как возвращается такой вывод? Поскольку такие упорядоченные и затем развёрнутые объекты это всего лишь некого рода моментальные снимки; они не обновляются сами по себе непрерывно. Например, когда вы получили определённые объекты, которые представляют тот процесс, который запущен в удалённом компьютере, то что вы получили обратно будет в точности тем, что имелось в тот конкретный момент времени, в который был выработаны эти объекты. Такие объекты, как применение памяти и использование ЦПУ не будут обновляться чтобы отражать последующие условия. Кроме того, вы не можете заставлять свои развёрнутые объекты выполнять что бы то ни было - вы не можете указывать им останавливать себя, например. 

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

Для работы удалённого взаимодействия у вас имеются два основных требования:

  • Ваш компьютер, и тот, в который вы желаете отправлять команды, оба, должны исполнять PowerShell v7.1 или последнюю версию. 
  • В идеале, оба компьютера должны быть участниками одного и того же домена или доменам с двусторонним доверием. Существует возможность получения удалённого взаимодействия для работы вне домена, однако это слишком заумно.

Настройка SSH в Windows

Ну что ж, теперь для Администратора очевидно что для для кросс-платформенного удалённого взаимодействия нам нужен SSH. SSH может запускаться как в рабочих станциях, так и в серверах Windows. Если вы и в самом деле пожелаете (не рекомендуется делать это), вы можете отключить WinRM. Скорее всего, если вы применяете SSH для удалённого взаимодействия в устройстве Windows, вы имеете удалённое взаимодействие с хостами Linux, или с них.

Установите клиент и сервер OpenSSH:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Первоначальная настройка получаемого сервера SSH:

Start-Service sshd

Set-Service -Name sshd -StartupType 'Automatic'

Подтвердите что настроены необходимые правила межсетевого экрана. Они должны создаваться настройкой автоматически:

Get-NetFirewallRule -Name *ssh*

В ответе должно иметься правило с названием OpenSSH-Server-In-TCP, которое должно быть включено. Настройте и измените файл sshd_config, размещённый в $env:ProgramData\ssh в своей целевой машине.

Убедитесь что удалив символ # вы разрешили аутентификацию по паролю:

PasswordAuthentication yes

Добавьте Subsystem для PowerShell. Вы можете обратить внимание на то, что мы пользуемся короткими именами 8.3 для тех путей файлов, которые содержат пробелы.

Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile

Значением короткого названия для папки Program Files в Windows, это обычно Progra~1. Однако , чтобы убедиться, вы можете воспользоваться приводимой ниже командой:

Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName

Вот необязательный ключ разрешения аутентификации по ключу:

PubkeyAuthentication yes

И перезапустите свою службу OpenSSH:

Restart-Service sshd

Готово!

Enter-PSSession и Exit-PSSession для удалённой работы один-к-одному

PowerShell применяет удалённое взаимодействие двумя различными способами. Первый это удалённое взаимодействие один- к- одному. Второй это удалённое взаимодействие один- ко- многим. При удалённом взаимодействии один- к- одному вы выполняете доступ к приглашению на ввод оболочки в отдельном удалённом компьютере. Все выполняемые вами команды запускаются непосредственно в этом компьютере, а вы наблюдаете результаты в окне своей оболочки. Это отчасти напоминает применение SSH или Remote Desktop Connection, за исключением того, что вы ограничены средой командной строки Windows PowerShell. 

Но прежде чем подключаться к некому удалённому компьютеру, нам необходимо разобраться с отличием между параметрами -hostname и - computername:

-hostname - применяйте его при использовании SSH.

-computername - применяйте его для подключения через WinRM.

PowerShell не обладает способом узнать какой протокол вы пытаетесь применять, поэтому вам придётся сообщать о нём. Для установления подключения один-к-одному с удалённым компьютером выполните такую команду:

Enter-PSSession -HostName Ubuntu1 -UserName tylerl

Enter-PSSession -ComputerName SRV2 -UserName contoso\tylerl

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

Enter-PSSession -HostName tylerl@Ubuntu1

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

[Ubuntu1] PS /home/tylerl>

[SRV2] PS C:\>

Такое приглашение оболочки сообщает вам, что всё что вы осуществляете, имеет место в Ubunut1, (либо в том сервере, к которому вы подключены). Вы можете выполнять ту команду, которую пожелаете. Вы даже способны импортировать модули. 

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

Все выполняемые вами в таком удалённом компьютере команды будут исполняться с теми полномочиями, которые вы применяли при аутентификации, поэтому вы будете иметь возможность выполнения всего того, что вы бы делали обычно имея полномочия. Это как если бы вы зарегистрировались в консоли такого компьютера и воспользовались бы непосредственно его копией PowerShell. Даже если вы обладаете в таком удалённом компьютере сценарием профиля PowerShell, он не будет выполнен при подключении с применением удалённого взаимодействия. Мы пока не использовали сценарий профиля, однако достаточно сказать, что он представляет собой пакет команд, который автоматически выполняется всякий раз при открытии вами соответствующей оболочки. Парни применяют их для автоматической загрузки расширений оболочке и модулей, а также тому подобного. Этого не происходит при удалённом взаимодействии с компьютером, а потому вам следует знать об этом.

Но постойте - что вам делать когда вы завершите выполнять команды на удалённом компьютере? Многие командлеты следуют парами: один командлет делает нечто, а другой - противоположное. В данном случае, раз Enter-PSSession доставляет вас в удалённый компьютер, можете ли вы угадать что выведет вас из этого удалённого компьютера? Но Вы догадались - это Exit-PSSession!

Этой команде не требуются никакие параметры, исполните её и приглашение в вашей командной оболочке вернётся в нормальное состояние, а удалённое подключение автоматически закроется.

Работает!

Всякий раз, когда начинающие пользуются удалённым взаимодействием, в течение дня наблюдаются общие проблемы:

  • удалённое взаимодействие разрабатывается с тем, чтобы быть более- менее автоматически настраиваемым. Когда все компьютеры вовлечены в один и тот же домен, и ваше имя пользователя одно и то же, обычно всё срабатывает отлично. Если это не так, для погружения в подробности вам необходимо выполнить help about_remote_troubleshooting.
  • при активации некой команды, вы запрашиваете у своего удалённого компьютера запустить PowerShell, исполнить свою команду и затем закрыть PowerShell. Ваша следующая активируемая команда в том же самом компьютере будет запускаться с нуля - всё то, что выполнялось при первой активации более не будет иметь место. Если вам требуется выполнять всю последовательность связанных команд, помещайте все их вместе в одной и той же активации.

Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?