Adam the automator

Myth Busting: PowerShell Cmdlets Curl

Before we get too deep into this article, let’s bust a popular myth that PowerShell’s Invoke-WebRequest or Invoke-RestMethod cmdlets are “replacements” for curl. This simply isn’t true. By looking at the help content for these commands, it’s clear each has different capabilities and use cases.

Take a look at what the curl documentation says:

Now compare that to the and cmdlet help documentation.

Breaking down how each tool is described, curl aims to be the premiere solution for transferring data from or to a server over many protocols.

Contrast that with the and PowerShell cmdlets that focus on more common communications with servers. These PowerShell cmdlets also provide a rich experience for working with returned data through PowerShell’s use of objects.

Using System.Net.Sockets.TcpClient to Test Connectivity

Microsoft .Net System.Net.Sockets.TcpClient provides telnet connectivity to remote host on specified port number.

To test connection with remote computer, use System.Net.Sockets.TcpClient method as below

New-Object System.Net.Sockets.TcpClient("192.168.0.6", 3389) 

In the above command, TcpClient method takes remote computer IP address and port number to test connection.

It returns detailed diagnostics information about test connection with remote computer over port number as below

In the above output,

Connected : True, if connection to remote computer over port is successful

Connected: False, if connection to remote computer over port is unsuccessful.

Cool Tip: How to use Get-AdDomainController to get domain controller in PowerShell!

Long Parameters in Bash vs. PowerShell

Since curl isn’t a scripting language like PowerShell is, it relies on the command shell it’s executed from. Most of the time that command shell is Bash.

Both the PowerShell cmdlets and curl both may require different parameters that may extend far past a terminal’s width. To make the syntax easier to read, each shell scripting language has its own way of handling this.

Take the below code for example. This example demonstrates sending an HTTP POST verb to a URL using a small bit of data. This code could be placed on one line but it would soon begin to wrap the screen or require scrolling. To remediate this, in Bash, you can use backslashes to continue the command onto a new line.

Contrast the line-wrapping method with PowerShell using either cmdlet. By using splatting, you can structure the same request performing the same task.

You can also mix and match the splatted and named parameters as shown below.

Платный тариф

Уже должно быть понятно, что curl — полезная вещь для тестировщика. Чтобы в этом мнении укрепиться, рассмотрим еще некоторые нюансы.

Распространенные инструменты тестирования API — бесплатные, но в них чаще всего бывают платными функции командной работы. Или например, запросы к социальным сетям (Вконтакте и Facebook) блокированы в бесплатном тарифе, и это один из немногих минусов в столь приятном продукте. 

В других похожих инструментах бывает слишком сложный интерфейс, но это не об curl. Для простоты, рекомендую работать в VSCode. Связка VSCode c curl — идеальная.

На скрине слева отрендеренный markdown-документ, справа полученные result.headers и result.json, и терминал внизу, куда тестировщику приходится глядеть чаще всего.

Вопреки убеждению, бытующему в определенных кругах, curl хорошо работает не только в REST-архитектуре, но и в SOAP.

Конечно, раскрыть все нюансы в одной статье невозможно, и чтобы продолжить знакомство с такой полезной вещью как curl, не обойтись без чтения официальной документации на их сайте. Там же и примеры использования.”

Write-Output

Командлет Write-Output отправляет указанный объект по конвейеру следующей команде. Если команда является последней командой в конвейере, объект отображается в консоли.

Write-Output отправляет объекты по основному конвейеру, также известному как «выходной поток» или «конвейер успеха». Чтобы отправить объекты ошибок по конвейеру ошибок, используйте Write-Error.

Этот командлет обычно используется в сценариях для отображения строк и других объектов на консоли. Однако, поскольку поведение по умолчанию заключается в отображении объектов в конце конвейера, обычно нет необходимости использовать командлет. Например,

Get-Process | Write-Output

эквивалентно

Get-Process

Итак, одной из особенностей echo и Write-Output является то, что эти команды не требуются.

Другая особенность — эти команды работают с объектами, поэтому простая строка с запятыми может быть выведена не так, как вы ожидаете.

К примеру, команда

Write-Output 1,2,3

Выведет:

1
2
3

Аналогично:

Write-Output Just a string
Just
a
string

Дело в том, что эти строки расцениваются как объекты, свойства которых перечислены через запятую и каждое новое свойство выводится на отдельной строке. Если вы хотите избежать такого поведения, то просто помещайте строку в одинарные или двойные кавычки.

Пример 1: Получение объекта и вывод его в консоль

$P = Get-Process
Write-Output $P

Первая команда получает список процессов, запущенных на компьютере, и сохраняет их в переменной $P.

Вторая команда отображает объекты процесса в $P на консоли.

Пример 2: Передача вывода другому командлету

Write-Output "test output" | Get-Member

Эта команда передаёт строку «test output» командлету Get-Member, который отображает члены класса System.String, демонстрируя, что строка была передана по конвейеру.

Пример 3: Подавление перечисления в выводе

Write-Output @(1,2,3) | Measure-Object

Вывод:

Count    : 3
...
Write-Output @(1,2,3) -NoEnumerate | Measure-Object

Вывод:

Count    : 1
...

Эта команда добавляет параметр -NoEnumerate для обработки коллекции или массива как одного объекта в конвейере.

Description

The cmdlet sends Internet Control Message Protocol (ICMP) echo request packets, or
pings, to one or more remote computers and returns the echo response replies. You can use this
cmdlet to determine whether a particular computer can be contacted across an IP network.

You can use the parameters of to specify both the sending and receiving computers,
to run the command as a background job, to set a time-out and number of pings, and to configure the
connection and authentication.

Unlike the familiar ping command, returns a
TestConnectionCommand+PingStatus object that you can investigate in PowerShell. The Quiet
parameter returns a Boolean value in a System.Boolean object for each tested connection. If
multiple connections are tested, an array of Boolean values is returned.

IPCONFIG в PowerShell

Описание: эта команда имеет множество опций, но чаще всего используется просто для того, чтобы показать IP-адрес, маску подсети и основной шлюз для каждого сетевого адаптера в системе.

В PowerShell: Get-NetIPConfiguration or Get-NetIPAddress

Пример командных строк:

  • Get-NetIPConfiguration
  • Get-NetIPAddress | Sort InterfaceIndex | FT InterfaceIndex, InterfaceAlias, AddressFamily, IPAddress, PrefixLength -Autosize
  • Get-NetIPAddress | ? AddressFamily -eq IPv4 | FT –AutoSize
  • Get-NetAdapter Wi-Fi | Get-NetIPAddress | FT -AutoSize

Примеры вывода команд:

PS C:> Get-NetIPConfiguration

InterfaceAlias : Wi-Fi
InterfaceIndex : 3
InterfaceDescription : Dell Wireless 1703 802.11b|g|n (2.4GHz)
NetProfile.Name : HomeWifi
IPv6Address : fded:b22c:44c4:1:88f2:9970:4082:4118
IPv4Address : 192.168.1.2
IPv6DefaultGateway :
IPv4DefaultGateway : 192.168.1.1
DNSServer : 192.168.1.1
InterfaceAlias : Bluetooth Network Connection
InterfaceIndex : 6
InterfaceDescription : Bluetooth Device (Personal Area Network)
NetAdapter.Status : Disconnected
InterfaceAlias : Ethernet
InterfaceIndex : 4
InterfaceDescription : Realtek PCIe GBE Family Controller
NetAdapter.Status : Disconnected

PS C:> Get-NetIPAddress | Sort InterfaceIndex | FT InterfaceIndex, InterfaceAlias, AddressFamily, IPAddress, PrefixLength –Autosize

InterfaceIndex InterfaceAlias                                AddressFamily IPAddress                            PrefixLength
————— —————                                ————- ———                            ——-
1 Loopback Pseudo-Interface 1                            IPv6 ::1                                      128
1 Loopback Pseudo-Interface 1                            IPv4 127.0.0.1                                  8
3 Wi-Fi                                                  IPv6 fe80::88f2:9970:4082:4118%3               64
3 Wi-Fi                                                  IPv6 fded:b22c:44c4:1:f188:1e45:58e3:9242     128
3 Wi-Fi                                                  IPv6 fded:b22c:44c4:1:88f2:9970:4082:4118      64
3 Wi-Fi                                                  IPv4 192.168.1.2                               24
4 Ethernet                                               IPv6 fe80::ce6:97c9:ae58:b393%4                64
4 Ethernet                                               IPv4 169.254.179.147                           16
6 Bluetooth Network Connection                           IPv6 fe80::2884:6750:b46b:cec4%6               64
6 Bluetooth Network Connection                           IPv4 169.254.206.196                           16
7 Local Area Connection* 3                               IPv6 fe80::f11f:1051:2f3d:882%7                64
7 Local Area Connection* 3                               IPv4 169.254.8.130                             16
8 Teredo Tunneling Pseudo-Interface                      IPv6 2001:0:5ef5:79fd:1091:f90:e7e9:62f0       64
8 Teredo Tunneling Pseudo-Interface                      IPv6 fe80::1091:f90:e7e9:62f0%8                64
9 isatap.{024820F0-C990-475F-890B-B42EA24003F1}          IPv6 fe80::5efe:192.168.1.2%9                 128

PS C:> Get-NetIPAddress | ? AddressFamily -eq IPv4 | FT –AutoSize

ifIndex IPAddress       PrefixLength PrefixOrigin SuffixOrigin AddressState PolicyStore
——- ———       ———— ———— ———— ———— ————
7       169.254.8.130             16 WellKnown    Link         Tentative    ActiveStore
6       169.254.206.196           16 WellKnown    Link         Tentative    ActiveStore
3       192.168.1.2               24 Dhcp         Dhcp         Preferred    ActiveStore
1       127.0.0.1                  8 WellKnown    WellKnown    Preferred    ActiveStore
4       169.254.179.147           16 WellKnown    Link         Tentative    ActiveStore

PS C:> Get-NetAdapter Wi-Fi | Get-NetIPAddress | FT -AutoSize

ifIndex IPAddress                            PrefixLength PrefixOrigin        SuffixOrigin AddressState PolicyStore
——- ———                            ———— ————        ———— ———— ————
3       fe80::88f2:9970:4082:4118%3                    64 WellKnown           Link         Preferred    ActiveStore
3       fded:b22c:44c4:1:f188:1e45:58e3:9242          128 RouterAdvertisement Random       Preferred    ActiveStore
3       fded:b22c:44c4:1:88f2:9970:4082:4118           64 RouterAdvertisement Link         Preferred    ActiveStore
3       192.168.1.2                                    24 Dhcp                Dhcp         Preferred    ActiveStore

История вопроса и задача

Есть замечательный ресурс smartfiction.ru, публикующий по будням короткие рассказы. Для меня главная ценность в их автоматической доставке на Kindle. Работает это очень просто: на сайте даете почтовый адрес Kindle, а в настройках Amazon добавляете в разрешенные адрес рассылки, после чего книга скачивает отправленные рассказы автоматически.

Точнее – работало, потому что в какой-то момент рассказы перестали приходить. Сервис подписки на другом домене, а он недоступен, как выяснилось. Я написал письмо на адрес обратной связи, но оно осталось без ответа. Однако рассказы на сайте публикуются, и под каждым есть ссылка для загрузки в mobi.

Поэтому задача свелась к тому, чтобы автоматизировать закачку этих файлов. Первая мысль была расчехлить консольный wget, но тут же возникла ассоциация с PowerShell. Ведь wget – это псевдоним командлета Invoke-WebRequest.

Получение списка IP-адресов компьютера

Список всех IP-адресов, используемых локальным компьютером, возвращает следующая команда:

Учитывая, что свойство IPAddress объекта Win32_NetworkAdapterConfiguration является массивом, необходимо использовать параметр ExpandProperty со значением для просмотра всего списка адресов.

С помощью командлета можно увидеть, что свойство IPAddress является массивом:

Свойство IPAddress каждого сетевого адаптера в действительности представляет собой массив. Фигурные скобки в определении указывают на то, что свойство IPAddress содержит не значение типа System.String, а массив значений типа System.String.

Проверка связи с компьютерами

Простую проверку связи с компьютером можно выполнить с помощью Win32_PingStatus. Следующая команда производит проверку связи, но при этом выводит большой объем сведений:

Удобнее отображать сводные данные, содержащие свойства Address, ResponseTime и StatusCode, как это делает приведенная ниже команда. Параметр Autosize командлета изменяет размер столбцов таблицы для их правильного отображения в PowerShell.

Значение 0 свойства StatusCode указывает на успешно выполненную проверку связи.

Для проверки связи с несколькими компьютерами с помощью одной команды можно использовать массив. Так как адресов несколько, для проверки связи с каждым адресом по отдельности можно использовать :

Один и тот же формат команды можно использовать для проверки связи со всеми компьютерами подсети. Например, при проверке частной сети, использующей номер сети 192.168.1.0 и стандартную маску подсети класса C (255.255.255.0), допустимы только локальные адреса в диапазоне от 192.168.1.1 до 192.168.1.254 (0 всегда зарезервирован в качестве номера сети, а 255 используется в качестве широковещательного адреса подсети).

Чтобы представить массив чисел от 1 до 254 в PowerShell, используйте выражение .
Таким образом, полную проверку связи с подсетью можно осуществить, добавив все значения в диапазоне к частичному адресу в операторе проверки связи:

Такой метод формирования диапазона адресов может быть использован в любых подобных случаях. Полный набор адресов можно сформировать следующим образом:

Как пользоваться curl?

Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

Загрузка файлов

Самая частая задача — это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:

Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:

А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

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

Если нужно, одной командой можно скачать несколько файлов:

Еще одна вещь, которая может быть полезной администратору — это загрузка файла, только если он был изменен:

Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости

Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

Передача файлов

Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:

Или проверим отправку файла по HTTP, для этого существует специальный сервис:

В ответе утилита сообщит где вы можете найти загруженный файл.

Отправка данных POST

Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

Передача и прием куки

Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

Затем можно отправить cookie curl обратно:

Передача и анализ заголовков

Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:

Аутентификация curl

Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:

Точно так же будет выполняться аутентификация на серверах HTTP.

Использование прокси

Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:

Добавить дополнительный заголовок

Вы можете добавить заголовок к запросу с помощью синтаксиса — header.

# curl –-header “X-CustomHeader: GeekFlare” http://yoururl.com

например:

# curl -v --header "X-CustomHeader: GeekFlare" 74.125.68   
* About to connect() to 74.125.68.100 port 80 (#0)   
*   Trying 74.125.68.100...   
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)   
> GET / HTTP/1.1   
> User-Agent: curl/7.29.0   
>Host: 74.125.68.100   
>Accept: */*   
> X-CustomHeader: GeekFlare
>< HTTP/1.1 200 OK   
<Date: Sun, 18 Jan 2015 08:30:25 GMT   
<Expires: -1   
< Cache-Control: private, max-age=0   
< Content-Type: text/html; charset=utf-8   
< Set-Cookie: NID=67=CkzDX-zTtWA0d9M1QVG4O3Im; 
expires=Mon, 20-Jul-2015 08:30:25 GMT; 
path=/; domain=.; HttpOnly
< P3P: CP="This is not a P3P policy! 
See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for moreinfo."   
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN   
<Alternate-Protocol: 80:quic,p=0.02   
<Accept-Ranges: none
<Vary: Accept-Encoding
<Transfer-Encoding: chunked

Автоматическое JavaScript-перенаправление на другую страницу

Если нужно автоматически перенаправить пользователя с одной страницы (URL1) на другую страницу (URL2), можно использовать следующий код:

window.location.href = 'URL2';

Необходимо вставить приведенный выше код на первую страницу (URL1). Замените URL2 на нужный адрес страницы. Лучше поместить этот код внутри элемента <head> (а не в нижней части страницы), чтобы страница перенаправлялась до того, как браузер начинает ее отображать.

СОВЕТ: Если вы используете встроенный JavaScript (т.е. без внешнего файла .js), не забудьте поместить код JavaScript в теги <script></script>.

Перенаправление на другую страницу через X секунд

В этом примере мы будем осуществлять js редирект на другую страницу через некоторое время после загрузки страницы. Например, если нужно перенаправить посетителя на главную страницу после отображения страницы приветствия в течение 5 секунд:

setTimeout(function(){
  window.location.href = 'homepage-url';
}, 5 * 1000);

Необходимо вставить приведенный код JavaScript на странице приветствия. Не забудьте заменить homepage-url на URL-адрес домашней страницы.

Мы использовали метод setTimeout, чтобы указать скрипту выполнить перенаправление через 5 секунд (умножаем 5 на 1000, чтобы преобразовать секунды в миллисекунды).

СОВЕТ: В JavaScript значения времени всегда рассчитываются в миллисекундах.

Перенаправление на другую страницу, исходя из условия

Например, можно выполнить перенаправление в зависимости от браузера посетителя (хотя это не рекомендуется), размера экрана, времени суток, или другого условия.

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

if (CONDITION) {
  window.location.href = 'redirect-url';
}

Например, этот код перенаправляет посетителей на другую страницу, если ширина их экрана меньше 600 пикселов:

if (screen.width < 600) {
  window.location.href = 'redirect-url';
}

Перенаправление на другую страницу на основе действий пользователя

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

Следующий код будет перенаправлять посетителя на целевую страницу после нажатия на #mybutton:

document.getElementById('mybutton').onclick = function() {
  window.location.href = 'redirect-url';
};

Можно сделать то же самое, используя следующий код:

<button onclick="window.location.href = '/'">Go to Homepage</button>

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

Я попытался рассмотреть все возможные случаи js редиректа на другую страницу. Если я когда-либо столкнусь с другими сценариями, я добавлю их в эту статью.

Вадим Дворниковавтор-переводчик статьи «Redirect to Another Page with JavaScript»

Получение и отправка cookie

Cookie используются сайтами для хранения некой информации на стороне пользователя. Сервер сохраняет cookie на стороне клиента (т.е. в браузере), отправляя заголовки:

Set-Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; path=/
Set-Cookie: visitor=fa867bd917ad0d715830a6a88c816033; expires=Mon, 16-Sep-2019 08:20:53 GMT; Max-Age=31536000; path=/
Set-Cookie: lastvisit=1537086053; path=/

А браузер, в свою очередь, отправляет полученные cookie обратно на сервер при каждом запросе. Разумеется, тоже в заголовках:

Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; visitor=fa867bd917ad0d715830a6a88c816033; lastvisit=1537086053

Передать cookie на сервер, как будто они были ранее получены от сервера:

> curl -b lastvisit=1537086053 http://www.example.com/

Чтобы сохранить полученные сookie в файл:

> curl -c cookie.txt http://www.example.com/

Затем можно отправить сохраненные в файле cookie обратно:

> curl -b cookie.txt http://www.example.com/catalog/

Файл имеет вид:

# Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

www.example.com    FALSE    /    FALSE    0             lastvisit        1537085301
www.example.com    FALSE    /    FALSE    1568621304    visitor          60f7c17ba4b5d77975dfd020f06ac8ca
www.example.com    FALSE    /    FALSE    0             PHPSESSID        p23cr2d14rlgj5kls58kd7l6a6

Using a Web Session / Cookies

When you need to save cookies between commands, such as a website login to access private pages, you’ll also want your cookies saved between sessions.

Curl asks you to use a “cookie jar” to hold these cookies which you can then use as your input “cookies” once logged in. You’ll have to do some work to find the actual form submission data that you need.

Using curl, you can specify a username and password to authenticate and a place for the curl “cookie jar”. Then, using the cookie obtained from that call, specify the “cookie jar” in the subsequent call as shown below.

PowerShell also allows you to store and use cookies/sessions as well using the cmdlet’s parameter.

The will store the cookie returned. Once complete, you can then use the parameter to pass that cookie to subsequent requests. Below you can see an example of filling out a form and using the same cookie returned when the form was queried earlier.

Сервер 1С:Предприятие на Ubuntu 16.04 и PostgreSQL 9.6, для тех, кто хочет узнать его вкус. Рецепт от Капитана

Если кратко описать мое отношение к Postgres: Использовал до того, как это стало мейнстримом.
Конкретнее: Собирал на нем сервера для компаний среднего размера (до 50 активных пользователей 1С).
На настоящий момент их набирается уже больше, чем пальцев рук пары человек (нормальных, а не фрезеровщиков).
Следуя этой статье вы сможете себе собрать такой же и начать спокойную легальную жизнь, максимально легко сделать первый шаг в мир Linux и Postgres.
А я побороться за 1. Лучший бизнес-кейс (лучший опыт автоматизации предприятия на базе PostgreSQL).
Если, конечно, статья придется вам по вкусу.

Парсинг сайтов

Парсинг, то есть возможность собирать информацию с сайтов, в Powershell реализована достаточно просто. Если мы посмотрим  какие свойства имеет объект команды Invoke-WebRequest, сможем увидеть теги:

Картинки

Для примера в HTML картинки хранятся в таком виде:

То есть все картинки имеют тег IMG и SRC. В Powershell часть тегов уже собрана в отдельные свойства и так мы получим список всех картинок:

Мы видим только ссылки на картинки, а значит нам нужно выполнить еще по запросу для каждой картинки. К тому же я хочу сохранить существующие имена для каждой картинки, так как у них разные форматы (PNG, JPG). Это будет выглядеть примерно так:

Обратите внимание, что если у вас не создана директория куда будут сохранятся картинки, появится ошибка. Iwr не создает директории

Парсинг других тегов

Парсинг остальной части сайта мало чем отличается от примера с картинками. Так как Images и Links выведены как основные свойства, то поиск, например, заголовков должен делаться через свойство AllElements. Для примера так я найду все теги h2:

Кроме поиска по тегам часто приходится искать по классам. Например так я найду все заголовки h2, но используя класс:

JSON

По умолчанию мы не можем работать с JSON объектами. Они будут восприниматься как строки пока мы не конвертируем объект в PSCustomObject. Это делается так:

После этого мы можем обращаться к свойствам:

После изменения мы возможно захотим отправить объект. Для этого мы конвертируем из PSCutomObject в JSON:

Вам так же будет интересно:

Работа по протоколу FTP

Скачать файл с FTP-сервера:

> curl -u username:password -O ftp://example.com/file.zip

Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней:

> curl -u username:password -O ftp://example.com/public_html/

Выгрузить файл на FTP-сервер

> curl -u username:password -T file.zip ftp://example.com/

Получить вывод из стандартного ввода и сохранить содержимое на сервере под именем :

> curl -u username:password -T - ftp://example.com/data.txt

Дополнительно:

  • Утилита curl. Обмен данными с сервером
  • Пользуемся curl для отладки HTTP

Поиск:
CLI • CURL • Cookie • FTP • GET • HTTP • Linux • POST • URL • Web-разработка • Windows • Форма

Показать заголовок запроса и ответа

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

# curl -v yoururl.com

например:

# curl -v 74.125.68.100   
* About to connect() to 74.125.68.100 port 80 (#0)   
*   Trying 74.125.68.100...   
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)   
> GET / HTTP/1.1   
> User-Agent: curl/7.29.0   
>Host: 74.125.68.100   
>Accept: */*   
>< HTTP/1.1 200 OK   
<Date: Sun, 18 Jan 2015 06:02:58 GMT   
<Expires: -1   
< Cache-Control: private, max-age=0   
< Content-Type: text/html; charset=utf-8   
< Set-Cookie: NID=67=EZH_o3sPvCSnxzVatz21OHv_; 
expires=Mon, 20-Jul-2015 06:02:58 GMT; 
path=/; 
domain=.; HttpOnly
< P3P: CP="This is not a P3P policy! 
See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for moreinfo."   
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN   
<Alternate-Protocol: 80:quic,p=0.02   
<Accept-Ranges: none
<Vary: Accept-Encoding
<Transfer-Encoding: chunked

Аутентификация

curl умеет проводить аутентификацию на сервере, когда по URL-адресу нужен ввод пользовательских имени-пароля. В этом случае получает ожидаемые имя и пароль в формате и сопоставляет значения с введенными. Если эти данные не введены, получается следующее:

curl -X GET "https://httpbin.org/basic-auth/carlos/secret" \
-H "accept: application/json" \
-D result.headers
HTTP/2 401 
date: Fri, 03 Sep 2021 04:08:44 GMT
content-length: 0

То есть код 401 (не прошла авторизация).

Добавим в запрос логин и пароль:

curl -X GET "https://httpbin.org/basic-auth/carlos/secret" \
-u carlos:secret
-H "accept: application/json" \
-D result.headers
HTTP/2 200 
date: Fri, 03 Sep 2021 04:14:19 GMT
content-type: application/json
content-length: 48
{
  "authenticated": true, 
  "user": "carlos"
}

Все хорошо, авторизация прошла успешно.

Curl позволяет авторизоваться и другими методами — например, с помощью токена. Токен просто отправляется в соответствующем заголовке.

Загрузка файлов по ссылкам

Информации выше уже достаточно для первой версии скрипта.

$Site = "http://smartfiction.ru/"
$HttpContent = Invoke-WebRequest -Uri $Site
$HttpContent.Links | Where-Object {$_.innertext -eq "mobi"} | 
%{Invoke-WebRequest -Uri $_.href -OutFile "$(Get-Random 10001)$(".mobi")"}

Первые три строки вы уже видели, поэтому разберу четвертую. Список ссылок по конвейеру передается командлету ForEach-Object (псевдоним %). Он выполняет запрос для каждой ссылки ($_.href) и сохраняет ответ сервера в файл со случайным именем и расширением mobi. Таким образом, со страницы скачиваются все книги в формате mobi.

Случайное имя с числовым значением от 0 до 10001 генерирует командлет Get-Random. Это костыль, потому что имя файла в атрибутах ссылки не содержится. Но до него можно добраться!

Измерь его правильно! Краткое описание общепринятого метода оценки производительности DB серверов

Сообщество программистов (администраторов) 1С является одним из самых замкнутых на себя.
Тот же JAVA senior без особых вопросов напишет код на PHP или на Python, если этого потребует обстановка.
1Сники же и powershell и bash и PHP и все остальное с разной степенью успешности реализуют на 1С.
В последнее время ситуация немного меняется, классическое высшее образование программистов уже не ограничивается ассемблером, бейсиком и фортраном.
Никто не падает в обморок при виде
class HelloWorld {
public static void main(String[] args) {
System.out.println(«Hello World!»);
}
}
Попробуем покуситься на тест Гилева и узнать, как без него обходятся DBA админы остального мира, слабонервных прошу удалиться, остальных прошу под кат…

Как добавить URL для сканирования

В Netpeak Spider реализована возможность добавлять URL двумя способами:

1.1. Ввести адрес в поле «Начальный URL» → сканирование начнётся с указанного URL и будет продолжаться, пока не будут просканированы все страницы сайта (если область сканирования не ограничена в настройках программы).
Чтобы быстрее добавить начальный URL, используйте подсказки. Они появляются под строкой, когда вы вводите в ней текст. Подсказки создаются на основе ваших прошлых проектов и того, что вы вводили ранее.

1.2. Добавить URL списком → для этого воспользуйтесь пунктом меню «Список URL», горячими клавишами либо панелью управления:

1.3. Ввести вручную (Ctrl+D) → открывает дополнительное окно для ввода списка страниц, где каждый URL должен быть с новой строки. После введения всех URL нажмите «Добавить». 

1.4. Загрузить из файла (Alt+O) → импортирует URL из файла, который может иметь следующие расширения:

  • .txt (Text file)
  • .xlsx (Microsoft Excel)
  • .csv (Comma-separated values)
  • .xml (XML file)
  • .nspj (проект Netpeak Spider) 
  • .ncpj (проект Netpeak Checker). 

Загрузить список URL из файла также можно, нажав «Добавить URL» на панели управления.

1.5. Загрузить из Sitemap → открывает инструмент «Валидатор XML Sitemap» (Alt+X), с помощью которого можно извлечь список URL из карты сайта для сканирования. Для этого необходимо:

  1. Ввести URL карты сайта в соответствующее поле;
  2. Выбрать режим просмотра «URL (Содержимое Sitemap)»;
  3. Нажать «Старт»;
  4. Перенести список URL в основную таблицу;
  5. В главном окне программы, запустить сканирование нажатием на «Старт».  

1.6. Drag and Drop → перетащите cписок URL или файл с вышеуказанными расширениями напрямую в основную таблицу: Netpeak Spider проанализирует файлы и загрузит необходимые данные.

1.7. Вставить из буфера обмена → комбинацией клавиш Ctrl+V или с помощью пункта «Список URL» в главном меню. 

Простой сканер IP-сетей/портов с помощью PowerShell

Вы также можете реализовать простой сетевой сканер портов и IP-подсетей для сканирования удалённых серверов или подсетей на предмет открытых/закрытых TCP-портов.

Просканируем диапазон IP-адресов в поисках открытого порта 80:

foreach ($ip in 100..150) {Test-NetConnection -Port 80 -InformationLevel "Detailed" 192.168.1.$ip}

А этот пример просканирует диапазон TCP-портов от 1 до 1024 на указанном удалённом сервере:

foreach ($port in 1..1024) {If ((Test-NetConnection 192.168.0.88 -Port $port -WarningAction SilentlyContinue).tcpTestSucceeded -eq $true){ "TCP port $port is open!"}}

Скорость проверки, конечно, оставляет желать лучшего.

Сжатие баз данных 1С:Предприятие в MS SQL Server Промо

Тема сжатия баз данных 1С в настоящий момент довольно часто обсуждается. Достоинства сжатия известны – уменьшение размера базы данных, уменьшение нагрузки на дисковую подсистему и некоторое ускорение выполнения тяжелых операций чтения/записи. Из недостатков – небольшое увеличение нагрузки на процессоры сервера СУБД за счет расхода ресурсов на компрессию/декомпрессию данных. Но при использовании в качестве MSSQL и DB2 (за Oracle и PostgreSQL не скажу, т.к. не знаю) есть один «подводный камень» — при выполнении реструктуризации происходит декомпрессия новых таблиц и индексов. Происходить это может как при выполнении обновления конфигурации с изменением структуры метаданных, так и при выполнении тестирования и исправления ИБ (реиндексация пересоздает только индексы, а реструктуризация – и таблицы, и индексы). «Проблема» кроется в том, что признак сжатия устанавливается индивидуально для каждой таблицы и индекса.

Аутентификация

Посмотрим на три способа аутентификации используя:  базовую (Basic), с использованием сертификата, NTLM и Kerberos.

Базовая аутентификация

Обычно сервер передает дополнительные данные для аутентификации, но в примере ниже это выполнение без их использования:

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

NTLM и Kerberos

Если вам нужно пройти аутентификацию для текущего пользователя вы можете добавить ключ -DefaultCredentials:

Этот ключ не будет работать вместе с аутентификацией типа Basic. 

Получение содержимого страницы и выбор нужных ссылок

Invoke-WebRequest умеет отправлять запросы HTTP/HTTPS/FTP, парсить ответ и возвращать наборы элементов HTML – ссылки, формы, изображения и т.д. Попробуйте любой сайт так:

Invoke-WebRequest -Uri "http://smartfiction.ru"

Для каждой ссылки легко выводится набор атрибутов.

$Site = "http://smartfiction.ru/"
$HttpContent = Invoke-WebRequest -Uri $Site
$HttpContent.Links

innerHTML : smartfiction
innerText : smartfiction
outerHTML : <A title=smartfiction href="http://smartfiction.ru/" rel=home>smartfiction</A>
outerText : smartfiction
tagName   : A
title     : smartfiction
href      : http://smartfiction.ru/
rel       : home

Передав запрос по конвейеру командлету Where-Object, можно получить список всех ссылок на книги в формате mobi (ниже показана только первая).

$HttpContent.Links | Where-Object {$_.innertext -eq "mobi"} | fl innerText, href

innerText : mobi
href      : http://convert.smartfiction.ru/?uri=http%3A%2F%2Fsmartfiction.ru%2Fprose%2Fhot_and_cold_blood%2F&amp;format
            =mobi

Вывод данных IP-конфигурации

Для отображения подробных данных IP-конфигурации каждого сетевого адаптера воспользуйтесь следующей командой:

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

В современных сетях TCP/IP вам, скорее всего, больше не понадобятся свойства IPX или WINS. Вы можете использовать параметр ExcludeProperty командлета , чтобы скрыть свойства, имена которых начинаются на WINS или IPX.

Эта команда выводит подробные сведения о DHCP, DNS, маршрутизации и других менее значительных свойствах IP-конфигурации.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: