Войти

Показать полную графическую версию : [решено] Вывод ip вместе с заголовком


Страниц : [1] 2

Freddy1984
12-08-2019, 14:13
Здравствуйте.
Подскажите пожалуйста как вместе с заголовком ответа от сервера ещё и ip дописать?
В таком виде в файл записывает только ответ без ip адреса:

ForEach ($LINK in Get-Content in.txt)
{&".\curl.exe" --head $LINK >>out.txt}


Подробности:
в файле in.txt имеется список ip. для примера:
185.5.97.86:8001

в файл out.txt должно выводится:
(соответственно пустые ip адреса - пропускать)

185.5.97.86:8001

HTTP/1.1 404 Not Found
Server: Astra Relay
Content-Type: text/html
Content-Length: 124

в данный момент по тому коду что я описал, в файл out.txt выводится:

HTTP/1.1 404 Not Found
Server: Astra Relay
Content-Type: text/html
Content-Length: 124

И второй момент. После запуска скрипта почему то идёт пауза в 30 сек. перед прогоном по списку. Для чего эта пауза если я её явно не прописывал?
Спасибо.

Busla
12-08-2019, 15:42
для этой опреации в PoSh существует командлет Invoke-WebRequest
AFAIK сначала резолвить, а после реквестить

Freddy1984
12-08-2019, 16:00
для этой опреации в PoSh существует командлет Invoke-WebReq »
да, но Invoke-WebRequest отрабатывает очень поверхностно, многих типов серверов заголовки вообще не считывает. Это я пробовал, тестировал. Пример: (Invoke-WebRequest -Method Get -Uri $url).Headers.Server|Out-File -encoding default out.txt
поэтому я и взял за основу curl.exe , он отрабатывает на ура.
Единственное что не хватает в коде, это дописывать ip из списка. Как прикрутить ума не приложу..

Elven
12-08-2019, 16:04
Busla, если моя память не спит с другим - правильно, ни curl ни Invoke-Webrequest не умеет IP возвращать адекватно, хотя для curl есть ключи -4 и -6 отвечающие за ipv4 и ipv6 соответственно.
Freddy1984, так написано же уже - сначала резолвить (например Resolve-DnsName) а потом уже реквестить.

Xaegr
12-08-2019, 16:08
$urlsfile = "in.txt"
$outfile = "out.txt"
foreach ($url in (get-content $urlsfile))
{
# Получаем урл
$Data = Invoke-WebRequest $url
# Резолвим IP из имени хоста полученного в веб-запросе (сам веб-запрос IP не резолвит, он ему не нужен)
$DNSResponse = $data.BaseResponse.ResponseUri.Host | Resolve-DnsName
#Дописываем IP в файл
$DNSResponse.IPAddress | add-content $outfile
#Заголовки в dictonary (hash) поэтому для вывода их в текстовый файл, сначала преобразовываем в plain text (хотя лучше конечно было бы выводить в json например).
$data.Headers | Out-String -Width 1mb | add-content $outfile
}


И второй момент. После запуска скрипта почему то идёт пауза в 30 сек. перед прогоном по списку. Для чего эта пауза если я её явно не прописывал?
Спасибо. »
Это либо curl.exe (уж не знаю зачем), либо чтение файла с урлами в память и преобразование в массив (это делает get-content автоматом) занимает столько времени (это конечно должен быть весьма большой файл). В принципе читать его в память сразу весь не обязательно, как и преобразовывать в массив. Но это уже man get-content

Freddy1984
12-08-2019, 16:15
Xaegr,
Я вас благодарю, но по вашему примеру в консольном окне почему то выводит: Invoke-WebRequest : Not Found

это конечно должен быть весьма большой файл »
как ни странно, но количество урлов в файле не влияет на таймаут. В любом случае отсчитывается 30 сек. Очень странно.

В принципе читать его в память сразу весь не обязательно, как и преобразовывать в массив. Но это уже man get-conten »
можно подробнее?? не понял про man get-conten...

Xaegr
12-08-2019, 16:23
но по вашему примеру в консольном окне почему то выводит: Invoke-WebRequest : Not Found »
Очень странно. А какая версия PowerShell? Не 1.0 ли? :) Что выводит
$psversiontable
?
И вообще, покажите ошибку то.

Vadikan
12-08-2019, 16:28
Freddy1984, установите WMF 5.1 https://www.microsoft.com/en-us/download/details.aspx?id=54616 и у вас много чего появится, не только invoke-webrequest

Freddy1984
12-08-2019, 16:30
А какая версия PowerShell? Не 1.0 ли? »
не, на винде 10-ке последняя.

И вообще, покажите ошибку то. »
Эта ошибка в следствии того, что Invoke-WebRequest к сожалению далеко не все типы серваков переваривает, о чем я написал выше..
Вот эта ошибка на рабочий сервер, который curl переваривает правильно:

Invoke-WebRequest : Невозможно соединиться с удаленным сервером
5 знак:9
+ $Data = Invoke-WebRequest $url
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebExc
eption
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Resolve-DnsName : Не удается проверить аргумент для параметра "Name". Аргумент пустой или имеет значение NULL. Укажите
непустой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
6 знак:54
+ $DNSResponse = $data.BaseResponse.ResponseUri.Host | Resolve-DnsName
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Resolve-DnsName], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.DnsClient.Commands.ResolveDnsName


установите WMF 5.1 https://www.microsoft.com/en-us/down....aspx?id=54616 и у вас много чего появится, не только invoke-webrequest »
Простите, но у меня винда 10-ка. :)

Xaegr
12-08-2019, 16:37
Invoke-WebRequest к сожалению далеко не все типы серваков переваривает, о чем я написал выше »
До сих пор не увидел примера.
Вот эта ошибка на рабочий сервер »
Пример url можно? Тут про "Invoke-WebRequest : Not Found" ничего нет.

Elven
12-08-2019, 16:41
А вот мне кажется я догадываюсь где собака порылась, хотя и не факт.
Скажите, Freddy1984, а не указан ли часом proxy в настройках винды?

Freddy1984
12-08-2019, 16:42
До сих пор не увидел примера. »
да, прошу прощения. Вот для примера: 185.5.97.86:8001

а не указан ли часом proxy »
нет. без прокси

Xaegr,
мне так кажется Resolve-DnsName тут будет лишним, так как список чисто из ip-шников...

Elven
12-08-2019, 17:11
так как список чисто из ip-шников... »
как вместе с заголовком ответа от сервера ещё и ip дописать »
может тогда просто переменную (та что $LINK) в out.txt записывать? :)

Freddy1984
12-08-2019, 17:12
может тогда просто переменную (та что $LINK) в out.txt записывать »
покажите пожалуйста пример. :)

Elven
12-08-2019, 17:28
например так:
$LINK >> out.txt

Freddy1984
12-08-2019, 17:30
например так »
так это ж вроде тоже самое что я и в первом сообщении написал..
что то я вас не понимать :)

Vadikan
12-08-2019, 18:21
Думаю, уже давно пора показать пример содержимого in.txt и объяснить, какой именно IP надо писать в out.txt

Busla
12-08-2019, 19:06
Xaegr, фигню написали: в реальной жизни это будут ip от других серверов ;-)

Invoke-WebRequest отрабатывает очень поверхностно, многих типов серверов заголовки вообще не считывает »
в качестве примера тут надо приводить список URL'ов, где Invoke-WebRequest пасует

ну и до кучи: --head - это метод HEAD, очевидно:
1) он несовместим с --get
2) у Invoke-WebRequest тоже надо указывать -Method Head, а не Get

Freddy1984
12-08-2019, 19:32
показать пример содержимого in.txt и объяснить, какой именно IP надо писать в out.txt »
в качестве примера тут надо приводить список URL'ов, где Invoke-WebRequest пасует »
в файле in.txt имеется:
185.5.97.86:8001

в файл out.txt должно выводится:
(соответственно пустые - пропускать)

185.5.97.86:8001

HTTP/1.1 404 Not Found
Server: Astra Relay
Content-Type: text/html
Content-Length: 124

в данный момент по тому коду что я описал в первом сообщении в файл out.txt выводится:

HTTP/1.1 404 Not Found
Server: Astra Relay
Content-Type: text/html
Content-Length: 124

по коду, который предоставил Xaegr, к сожалению вообще ничего не выводит.

greg zakharov
12-08-2019, 21:22
Freddy1984, curl не прост, совсем не прост (С). Вы не можете ему просто так взять и скормить IP-адрес в обход DNS.
Допустим, есть у вас список:
122.10.11.13:8000
132.28.1.84:443
...
Доступность IP "извне" можно проверить следующим командным сценарием:
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2 delims=:" %%i in ('type in.txt') do (
call:request %%i %%j
)
endlocal
exit /b

:request
for /f "tokens=2*" %%i in (
'nslookup %~1 ^| findstr /irc:"\.[a-z]*$"'
) do (
echo:%~1:%~2
curl -IH "Host: %%i" %~1
)
exit /b
Если бы список представлял собой URL'ы, тогда было бы проще:
curl -I target.org -w "%{remote_ip}:%{remote_port}"
Правда тогда пара IP:Port были бы в конце вывода и потребовалось бы лишь поменять местами пару и заголовок.




© OSzone.net 2001-2012