Установка и настройка плагина
Для установки связи между плагином и Windows PowerShell необходимо настроить WinRM для использования одного из поддерживаемых протоколов обмена данными.
Поддерживаемые протоколы
Плагин поддерживает протокол управления Windows Remote Management (WinRM) 2.0.
Методы аутентификации
Kerberos: Безопасный протокол аутентификации, использующий билеты для проверки подлинности клиента и сервера.
WinRM через HTTP
Плагин поддерживает связь с хостом WinRM через протокол HTTP. Хотя WinRM аутентифицирует связь, передача данных не зашифрована и отправляется как обычный текст по сети. HTTP протокол следует использовать в случае настроенного IPSec между общающимися устройствами.
Чтобы использовать базовую аутентификацию, необходимо установить свойство в true как в службе, так и в клиентской конфигурации WinRM. Пример настройки через HTTP смотрите в Настройке WinRM для использования HTTP.
WinRM через HTTPS
Плагин поддерживает общение с хостом WinRM через протокол HTTPS. HTTPS протокол можно использовать как более безопасный способ обмена данными.
Для использования протокола HTTPS необходимо сгенерировать сертификат для аутентификации сервера и установить его на хосте WinRM. Пример настройки через HTTPS смотрите в Настройке WinRM для использования HTTPS.
Аутентификация Kerberos
Мы можем легко воспользоваться командным окном или PowerShell для генерации ключевой пары. Для этого используется встроенный клиент SSH в Windows.
Генерация ключевой пары SSH на системах UNIX
Привет всем! В продолжение публикации о возможностях PowerShell, хочу отметить, что в следующей статье будет описано использование библиотеки Selenium с этим языком. Этот маленький гайд поможет понять, что представляет из себя данная библиотека и общее представление о том, как с ней работать. Независимо от выбранного вами языка, принцип работы с Selenium одинаковый.
Сразу отвечу на вопрос для тех, кто не знает, что это за библиотека или кому она может пригодиться. Selenium в первую очередь инструмент для функционального тестирования. Это когда необходимо выполнить ряд действий, имитируя действия реального пользователя, и убедиться, что функционал веб-приложения работает правильно.
Реже используется для автоматизации задач в браузере, например, вызов JavaScript функций с помощью нажатия кнопок или заполнение форм и т.п. для которых нет API. В некоторых случаях Selenium может быть более удобной и полноценной альтернативой.
Как системному администратору, мне было удобно автоматизировать действия в панелях управления различных сервисов или собирать специфические метрики с отправкой в базу данных. Selenium может также быть полезным инструментом для DevOps-инженеров.
На мой взгляд, инструмент очень интересный с точки зрения творческого подхода к решению различных задач.
Работа с Selenium в PowerShell
Постараюсь разложить все по полочкам, от установки всех зависимостей до примера работы с данным инструментом, также продемонстрирую альтернативный инструмент, который использовал до знакомства с Selenium.
Для начала определимся с шаблоном, который будем использовать при написании любого скрипта в дальнейшем. В начале необходимо загрузить установленные ранее зависимости.
Установка всех зависимостей
Итак, что требуется для работы:
Процесс установки и обновления вышеперечисленного у меня получилось автоматизировать.
Для быстрого развертывания всех зависимостей достаточно воспользоваться одной командой в терминале:
Invoke-Expression (Invoke-WebRequest https://raw.githubusercontent.com/username/ps1/master/install_selenium.ps1).Content
Этот скрипт установит портативную версию браузера Chromium, chromedriver.exe, WebDriver.dll и WebDriver.Support.dll актуальных версий на текущий момент в вашем домашнем каталоге.
Пример использования
Давайте посмотрим на пример того, как использовать Selenium в PowerShell. Для начала откроем онлайн калькулятор, посчитаем сумму двух чисел и выведем результат на экран консоли.
$driver = Start-SeChrome
$driver.Navigate().GoToUrl(https://www.google.com)
$element = $driver.FindElementById(lst-ib)
$element.SendKeys(calculator online)
Таким образом, мы начали работу с Selenium, открыв нужный URL и вводя текст в поисковую строку. Остальные действия с элементами на странице можно выполнить аналогичным образом.
Поиск элементов
Поиск элементов является ключевым моментом при работе с Selenium. Можно использовать два способа:
- FindElementById: поиск элемента по его
id
на странице. - FindElementByClassName: поиск элемента по его классу.
Выбор метода зависит от структуры HTML страницы и уникальности элемента, которого вы ищете.
Надеюсь, это руководство поможет вам начать использовать Selenium в PowerShell для автоматизации ваших задач!
## DevTools - инструменты для веб-разработчиков
DevTools - это встроенный набор инструментов для веб-разработчиков и тестировщиков.
Для того чтобы использовать DevTools, откройте нужную веб-страницу в своем браузере и запустите инструменты, нажав F12 или щелкнув правой кнопкой мыши и выбрав Просмотреть код.
Вам может понадобиться вкладка Элементы для изучения структуры страницы и отслеживания запросов.
## Поиск элементов через DevTools
1. Выберите нужный элемент (например, поисковую строку) на странице.
2. Используйте комбинацию клавиш Ctrl+Shift+C и наведите курсор на элемент для его выделения.
3. Анализируйте элемент и формируйте запросы для поиска подобных элементов.
## Поиск элементов через PowerShell
Если элемент не имеет уникальных идентификаторов, можно использовать PowerShell для поиска по тегам.
Этот метод может требовать дополнительной фильтрации элементов.
Пример поиска элементов по id и тегу:
```powershell
$element = FindElementById(elementId)
$elements = FindElementsByTagName(tagName)
Взаимодействие с элементами
Как только вы нашли нужный элемент, сохраните его в переменную для последующего взаимодействия.
Например, используйте метод SendKeys
для ввода текста.
$element.SendKeys(Текст для ввода)
Чтобы взаимодействовать с кнопкой поиска, используйте метод SendKeys
для ввода текста и затем метод Enter
для выполнения поиска.
$searchButton.SendKeys(Запрос)
$searchButton.SendKeys([System.Windows.Forms.Keys]::Return)
```markdown
На данном этапе мы выполнили переход на новый url, где получаем содержимое страницы с результатом поиска. В нашем случае, калькулятор уже находится на странице, специально для примера используем второй подход, где вначале находим все элементы с тэгом div, которые отвечают за нажатие, фильтруем вывод по роли (ComputedAccessibleRole) - Button и лейблу (ComputedAccessibleLabel, также можно использовать свойство Text) – 2\.
После чего производим два нажатия, используя метод Click(). Выглядит это так:
Мы нашли цифру 2, и нажали на нее два раза. Далее находим элемент, отвечающий за сложение. У данного элемента свойство Lable имеет содержимое сложение, которое отличается от Text, где содержимым является +, после чего нажимаем на искомый элемент:
К остальным элементам обратимся по jsname (которые мы предварительно находим через DevTools). Теперь, нам остается забрать полученный результат, чтобы вывести его в консоль. Для этого достаточно обратиться к нужному элементу и получить значение его свойства Text.
Обратите внимание, как быстро происходит обращение к элементам на прямую. При фильтрации имеющихся 1092 элементов (в примере) с тэгом div, для поиска одного элемента уходит порядка 3-4 секунд, что ощутимо дольше и нецелесообразно для использования в конечном скрипте:
Сравнение скорости при поиске элемента по тэгу и селектору. Получаем наш результат сложения.
Пример целиком опубликован на GitHub.
Для второго случая продемонстрирую пример с ChatGPT. Это альтернатива, т.к. для подобных сервисов (обобщаю в примере с другими модулями) присутствует API, но иногда невозможно получить такой токен бесплатно, а ввиду ограничений в нашей стране даже приобрести напрямую за деньги, что послужило для меня отправной точкой создания подобных модулей.
Цель простая, общаться с ИИ используя только консоль PowerShell. Еще, это может оказаться полезным, если вы хотите внедрить такое решение в свой скрипт для генерации ответов (например, произвести парсинг динамических данных) или даже части кода (зависит от задач и потребностей, тенденция растет с каждым днем). И тут действительно все очень просто, нам нужен любой бесплатный сервис, который желательно не требует авторизации, после чего найти элемент, который отвечает за ввод текста и передать в него параметр $Text с нашим запросом (он и будет использоваться параметром в модуле для задаваемых нами вопросов), после чего дождаться ответа и получить результат. Вот пример для вышеупомянутого шаблона:
Важным моментом является получение конечного результата ответа на наш вопрос, т.к. ChatGPT не отвечает сразу, а постепенно генерирует текст на экране. Нам всегда надо за что-то зацепиться, для проверки, что ответ был получен полностью, только после этого прочитать его. В примере я использую содержимое свойства кнопки – Text, когда оно имеет значение Clear, можно производить новый запрос, соответственно ответ на предыдущий запрос уже был получен. Но это всегда индивидуально, в нашем случае можно было считать кол-во элементов c тэгом div, его значение вырастает на 7 после каждого полученного ответа. Пример работы с таким модулем выглядит так:
Общаемся с ChatGPT в консоли PowerShell.
Если вы уже установили зависимости, то для установки модуля Get-GPT из репозитория GitHub можете воспользоваться следующей командой:
По тому же принципу можно написать модуль, который позволят производить запросы для перевода текста. К слову, я уже писал автоматизированный модуль для перевода текста в консоли с использованием бесплатного публичного API для Google Translate и эмулятора DeepLX, для меня это самый удобный способ, который я использую ежедневно. Планирую написать модуль для bash и отдельную статью, т.к. на мой взгляд такой простое решение может оказаться полезно и другим.
Приведу еще один пример, у меня была задача получать значения измерения скорости интернета от провайдера, используя публичные сервисы, такие как LibreSpeed, OpenSpeedTest и Ookla SpeedTest. Во всех случаях достаточно перейти на нужный url сервиса, нажать кнопку измерения, по завершению получить результат – метрики измерений, и заполнить ими объект System.Collections.Generic.List.
Измерение скорости интернета в консоли PowerShell.
В большинстве случаев, когда мы хотим получить результат работы, заранее необходимо найти элемент, в котором эти данные будут нам доступны и зафиксировать его в переменной. В дальнейшем, по результатам проделанных нами действий, мы добавляем в бесконечный цикл найденный ранее элемент и сравниваем его значение с текущим значение этого же элемента, тем самым убеждаясь, что данные обновлены, после чего забираем результат и завершаем цикл. Тот же принцип, если мы ожидаем, что по результату текущий url обновится (т.е. мы перейдем на другую страницу), в таком случае проверяем его. Вот пример:
В примере с SpeedTest, если из полученного url нам нужно получить данные всей страницы, то можем просто прочитать его содержимое, используя Invoke-RestMethod (аналог клиента Curl в Windows). Нужные нам значения можно получить по средствам парсинга HTML-страницы, в некоторых случаях можно попытаться вытащить кусок JSON, который PowerShell сразу преобразует в объект и его достаточно только отфильтровать или пересобрать, что очень сильно упрощает процесс:
Используя модуль Get-SpeedTest, можно прямо в консоли получать результаты измерений, которые в свою очередь возможно настроить на отправку в базу данных временных рядов, например, InfluxDB и отображать в виде графиков в Grafana:
Перевод метрик в МБ или ГБ можно средствами самой Grafana, в примере этого не было сделано.
Работу (Ookla-SpeedTest-API) с отправкой метрик измерений скорости интернета я делал еще в Internet Explorer c использованием COM (Component Object Model) интерфейса. Это устаревший вариант, который можно использовать как альтернативу Selenium. Принцип работы у него точно такой же, при этом никаких зависимостей не требуется и работает по сей день. Тем не менее, если станет интересно, я оставлял заметки на тему работы с IE, а также с InfluxDB. Планирую (как только подготовлю тестовый стенд), написать отдельную статью по работе с InfluxDB, используя PowerShell или Bash и настройки графиков в Grafana.
По итогу, если взять за основу представленный выше шаблон и ознакомиться с примерами, можно автоматизировать выполнение процессов в Web-приложениях и даже добавлять такие решения в свои Pipeline.
As far as I know, Powershell 5 does not support importing RSA public keys in X.509/SPKI or PKCS#1 format (note that PKCS#8 is a private key format), neither PEM nor DER encoded. XML is supported (via FromXmlString()), but not by the crypto module of NodeJS.
However, it is possible to export the RSA public key in NodeJS in JWK format (supported since v15.9.0). The JWK can be easily converted to the XML format, especially for public RSA keys, since they contain only two parameters, the modulus (n) and the public exponent (e). Once the key is in XML format, it can be imported with FromXmlString().
The NodeJS code exports the public key as JWK and the private key as PEM encoded PKCS#1 key.
The exported public key can be used in the above Powershell script. The ciphertext generated by the Powershell script can be decrypted with the private key using a suitable code/tool (e.g. CyberChef), proving the correct encryption by the Powershell script.