Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вывод ip вместе с заголовком (http://forum.oszone.net/showthread.php?t=341773)

Freddy1984 12-08-2019 14:13 2883717

Вывод ip вместе с заголовком
 
Здравствуйте.
Подскажите пожалуйста как вместе с заголовком ответа от сервера ещё и ip дописать?
В таком виде в файл записывает только ответ без ip адреса:
Код:

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

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

185.5.97.86:8001 

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

PHP код:

185.5.97.86:8001

HTTP
/1.1 404 Not Found
Server
Astra Relay
Content
-Typetext/html
Content
-Length124 

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

PHP код:

HTTP/1.1 404 Not Found
Server
Astra Relay
Content
-Typetext/html
Content
-Length124 

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

Busla 12-08-2019 15:42 2883730

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

Freddy1984 12-08-2019 16:00 2883732

Цитата:

Цитата Busla
для этой опреации в 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 2883734

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

Xaegr 12-08-2019 16:08 2883735

PHP код:

$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


Цитата:

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

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

Freddy1984 12-08-2019 16:15 2883739

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

Цитата:

Цитата Xaegr
это конечно должен быть весьма большой файл »

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

Цитата:

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

можно подробнее?? не понял про man get-conten...

Xaegr 12-08-2019 16:23 2883744

Цитата:

Цитата Freddy1984
но по вашему примеру в консольном окне почему то выводит: Invoke-WebRequest : Not Found »

Очень странно. А какая версия PowerShell? Не 1.0 ли? :) Что выводит
$psversiontable
?
И вообще, покажите ошибку то.

Vadikan 12-08-2019 16:28 2883746

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

Freddy1984 12-08-2019 16:30 2883747

Цитата:

Цитата Xaegr
А какая версия PowerShell? Не 1.0 ли? »

не, на винде 10-ке последняя.

Цитата:

Цитата Xaegr
И вообще, покажите ошибку то. »

Эта ошибка в следствии того, что 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

Цитата:

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

Простите, но у меня винда 10-ка. :)

Xaegr 12-08-2019 16:37 2883752

Цитата:

Цитата Freddy1984
Invoke-WebRequest к сожалению далеко не все типы серваков переваривает, о чем я написал выше »

До сих пор не увидел примера.
Цитата:

Цитата Freddy1984
Вот эта ошибка на рабочий сервер »

Пример url можно? Тут про "Invoke-WebRequest : Not Found" ничего нет.

Elven 12-08-2019 16:41 2883754

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

Freddy1984 12-08-2019 16:42 2883755

Цитата:

Цитата Xaegr
До сих пор не увидел примера. »

да, прошу прощения. Вот для примера: 185.5.97.86:8001

Цитата:

Цитата Elven
а не указан ли часом proxy »

нет. без прокси

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

Elven 12-08-2019 17:11 2883772

Цитата:

Цитата Freddy1984
так как список чисто из ip-шников... »

Цитата:

Цитата Freddy1984
как вместе с заголовком ответа от сервера ещё и ip дописать »

может тогда просто переменную (та что $LINK) в out.txt записывать? :)

Freddy1984 12-08-2019 17:12 2883773

Цитата:

Цитата Elven
может тогда просто переменную (та что $LINK) в out.txt записывать »

покажите пожалуйста пример. :)

Elven 12-08-2019 17:28 2883775

например так:
Код:

$LINK >> out.txt

Freddy1984 12-08-2019 17:30 2883777

Цитата:

Цитата Elven
например так »

так это ж вроде тоже самое что я и в первом сообщении написал..
что то я вас не понимать :)

Vadikan 12-08-2019 18:21 2883784

Думаю, уже давно пора показать пример содержимого in.txt и объяснить, какой именно IP надо писать в out.txt

Busla 12-08-2019 19:06 2883788

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

Цитата:

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

в качестве примера тут надо приводить список URL'ов, где Invoke-WebRequest пасует

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

Freddy1984 12-08-2019 19:32 2883790

Цитата:

Цитата Vadikan
показать пример содержимого in.txt и объяснить, какой именно IP надо писать в out.txt »

Цитата:

Цитата Busla
в качестве примера тут надо приводить список URL'ов, где Invoke-WebRequest пасует »

в файле in.txt имеется:
PHP код:

185.5.97.86:8001 

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

PHP код:

185.5.97.86:8001

HTTP
/1.1 404 Not Found
Server
Astra Relay
Content
-Typetext/html
Content
-Length124 

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

PHP код:

HTTP/1.1 404 Not Found
Server
Astra Relay
Content
-Typetext/html
Content
-Length124 

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

greg zakharov 12-08-2019 21:22 2883798

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 были бы в конце вывода и потребовалось бы лишь поменять местами пару и заголовок.

Freddy1984 12-08-2019 21:35 2883799

Цитата:

Цитата greg zakharov
Вы не можете ему просто так взять и скормить IP-адрес в обход DNS »

почему? а как же параметр --url ?
цитата из справки:
"Задаёт url. Параметр полезен для указания адресов URL в файле конфигурации. Для контроля куда файл будет записан используйте параметры -o, --output или -O, --remote-name.
Параметр можно использовать любое количество раз.
"

greg zakharov 12-08-2019 21:44 2883802

Freddy1984, а вам не кажется, что URL и IP суть разные вещи? Читайте по буквам: URL - унифицированный локатор ресурса, IP - сетевой адрес узла. Вы где-нибудь видели в справке curl параметр --ip?

Vadikan 12-08-2019 21:56 2883806

Цитата:

Цитата Freddy1984
в файле in.txt имеется: »

Т.е. вы фактически хотите загонять $LINK в out.txt? Тогда так
Код:

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

Или здесь никто не понимает, чего вы хотите :)

Freddy1984 12-08-2019 21:56 2883807

Цитата:

Цитата greg zakharov
а вам не кажется, что URL и IP суть разные вещи? Читайте по буквам: URL - унифицированный локатор ресурса, IP - сетевой адрес узла. Вы где-нибудь видели в справке curl параметр --ip »

простите, я это хорошо знаю, но вы явно не знаете что в контексте работы curl, данный параметр (--url) подходит как для работы с урлами, так и с сетевыми ip адресами.
но это мы уже совсем далеко от темы ушли...
я знаю как на cmd реализовать построчное чтение из файла ip адресов с помощью curl (и там как раз без --url не обойтись) и запись заголовков с ip адресом в файл, но с PowerShell у меня большие недопонимания, от того и задал тут вопрос.

Цитата:

Цитата Vadikan
Т.е. вы фактически хотите загонять $LINK в out.txt? Тогда так »

да, как я писал уточнения ещё на второй странице - пустые пропускать.
По вашему коду всё почти правильно работает, только кроме рабочих, в файл дописывает ещё и не рабочие.

Цитата:

Цитата Vadikan
Или здесь никто не понимает, чего вы хотите :) »

я же на 2-й странице сделал довольно развёрнутое уточнение, там же всё понятно и наглядно с примерами :)

Vadikan 12-08-2019 22:43 2883814

Модераториал
Цитата:

Цитата Freddy1984
да, как я писал уточнения ещё на второй странице - пустые пропускать. »

Цитата:

Цитата Freddy1984
я же на 2-й странице сделал довольно развёрнутое уточнение »

Я вам как администратор конференции скажу. В этой теме 25 постов без решения не потому что отвечающие не обладают достаточной квалификацией. А потому что ТС не может внятно изложить свою задачу и исходные условия. И даже после того как из него вытагивают их по крупицам клещами, ему в голову не приходит заносить все подробности в первый пост.

Freddy1984 12-08-2019 22:52 2883818

Цитата:

Цитата Vadikan
все подробности в первый пост. »

намёк однозначен :)))
Ок

YuS_2 13-08-2019 08:43 2883845

Цитата:

Цитата Freddy1984
в файле in.txt имеется список ip. для примера: »

Ну, списка, положим, тут нет, а есть только один IP адрес с указанным портом...
Для тестирования необходимо было бы указать пару существующих и пару несуществующих.

Цитата:

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

Т.е. не существующие IP? "Пустые" - не совсем понятно.

Цитата:

Цитата Freddy1984
После запуска скрипта почему то идёт пауза в 30 сек. перед прогоном по списку. »

а поместите в список первым адресом проверенный, т.е. тот который действительно существует...

А так, учитывая всё вышенаписанное, попробуйте так:
Код:

$fin = 'in.txt'
$fout = 'out.txt'

gc $fin -enc utf8|%{
        $tmp = $(curl.exe -Im 3 "$_")
        if ($tmp -match 'http'){
                $_,$tmp|out-file $fout -enc utf8 -app
        }
}


Freddy1984 13-08-2019 09:08 2883847

Цитата:

Цитата YuS_2
Т.е. не существующие IP? "Пустые" - не совсем понятно. »

да, те адреса, которые не отдают заголовки (или вообще не рабочие), пропускать и не записывать в out.txt
Отрабатывает прекрасно! Громадный респект Вам!!

Можно ещё тогда вопрос?
так как на обработку каждой строки уходит 3 сек. (да, можно регулировать, понимаю), то прогон достаточно увесистого списока может занять приличное время. Я тут гуглил, и наткнулся на некий асинхронный метод прогона (я так понял это многопоточный, или многопроцессный режим).
Можно попросить вас посмотреть, возможно ли асинхронный метод совместить с вашим кодом?
Пример:
PHP код:

$urllist 1..97
$batchSize 
20

$results 
= [System.Collections.ArrayList]::new()

$i 1
foreach($url in $urllist) {

  
$w = [System.Net.Webclient]::new().DownloadStringTaskAsync("http://www.example.com?q=$i")
  
$results.Add($w) | Out-Null

  
if($i $batchSize -eq 0 -or $i -eq $urllist.Count) {
      While(
$false -in $results.IsCompleted) {sleep -Milliseconds 300# waiting for batch to complete
       
Write-Host " ........   Batch completed   ......... $i" -ForegroundColor Green
       
foreach($r in $results) { 
         New-
Object PSObject -Property @{url $r.AsyncState.AbsoluteURIjobstatus =$r.Statussuccess = !$r.IsFaulted
         
# if you need response text use $r.Result
       
}
     
$results.Clear()
   }

$i+=1




YuS_2 13-08-2019 12:37 2883864

Цитата:

Цитата Freddy1984
так как на обработку каждой строки уходит 3 сек. »

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

Цитата:

Цитата Freddy1984
Можно попросить вас посмотреть, возможно ли асинхронный метод совместить с вашим кодом? »

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


Время: 15:23.

Время: 15:23.
© OSzone.net 2001-