2015-03-23 13 views
5

Ich brauche Powershell, um IP-Adressen über Whois aufzulösen. Meine Firma filtert port 43 und WHOIS-Abfragen, so dass die Problemumgehung, die ich hier verwenden muss, Powershell ist, eine Website wie https://who.is zu verwenden, den http-Stream zu lesen und nach dem Organisationsnamen zu suchen, der der IP-Adresse entspricht.Finden Sie bestimmte Satz in einer Webseite mit Powershell

Bisher habe ich es geschafft, die Webseite in Powershell (Beispiel hier mit einem WHOIS auf yahoo.com) gelesen zu erhalten, die https://who.is/whois-ip/ip-address/206.190.36.45 ist

So, hier ist mein Code-Schnipsel:

$url=Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45 

jetzt, wenn ich tun:

$url.gettype() 
IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  False HtmlWebResponseObject     Microsoft.PowerShell.Commands.WebResponseObject 

ich sehe das Objekt mehrere Eigenschaften hat:

Name    MemberType Definition 
----    ---------- ---------- 
Equals   Method  bool Equals(System.Object obj) 
GetHashCode  Method  int GetHashCode() 
GetType   Method  type GetType() 
ToString   Method  string ToString() 
AllElements  Property Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;} 
BaseResponse  Property System.Net.WebResponse BaseResponse {get;set;} 
Content   Property string Content {get;} 
Forms    Property Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;} 
Headers   Property System.Collections.Generic.Dictionary[string,string] Headers {get;} 
Images   Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;} 
InputFields  Property Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;} 
Links    Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;} 
ParsedHtml  Property mshtml.IHTMLDocument2 ParsedHtml {get;} 
RawContent  Property string RawContent {get;} 
RawContentLength Property long RawContentLength {get;} 
RawContentStream Property System.IO.MemoryStream RawContentStream {get;} 
Scripts   Property Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;} 
StatusCode  Property int StatusCode {get;} 
StatusDescription Property string StatusDescription {get;} 

aber jedes Mal, wenn ich versuchen, Befehle wie

$url.ToString() | select-string "OrgName" 

Powershell gibt den gesamten HTML-Code, weil es die Textzeichenfolge als Ganzes interpretiert. Ich fand eine Problemumgehung, indem ich die Ausgabe in eine Datei ablege und dann die Datei durch ein Objekt lese (also jede Zeile ist ein Element eines Arrays), aber ich habe Hunderte von IPs zu überprüfen, so dass es nicht sehr optimal ist, eine Datei zu erstellen.

Ich würde gerne wissen, wie ich den Inhalt der Webseite https://who.is/whois-ip/ip-address/206.190.36.45 lesen konnte und die Zeile, die sagt: OrgName: Yahoo! Broadcast Services, Inc.

und nur diese Zeile.

Vielen Dank für Ihre Hilfe! :)

+0

konnte ich nicht meine eigene Frage bearbeiten, so bin ich das Hinzufügen Kommentar hier aber offensichtlich $ url, $ web, $ a sind eigentlich die ein und die selbe Variable. Ich habe vergessen, meinen Entwurf richtig zu bearbeiten, sorry für die Verwirrung. – Bluz

+1

Die Variablen wurden so geändert, dass sie der erste von Ihnen verwendete Name sind. – Matt

Antwort

8

Es gibt wahrscheinlich bessere Möglichkeiten, dies zu analysieren, aber Sie waren auf der richtigen Spur mit Ihnen aktuelle Logik.

$web = Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45 
$web.tostring() -split "[`r`n]" | select-string "OrgName" 

Select-String zurückkehren, das Spiel, wie es zuvor, eine lange Reihe war. Mit -split können wir es brechen, um nur die Rendite zu erhalten, die Sie erwartet haben.

OrgName:  Yahoo! Broadcast Services, Inc. 

Einige String-Manipulation danach wird eine sauberere Antwort bekommen. Auch dies auch

(($web.tostring() -split "[`r`n]" | select-string "OrgName" | Select -First 1) -split ":")[1].Trim() 

I viele Wege Select -First 1 als select-string verwendet nähern könnte mehr als ein Objekt zurück. Es würde nur sicherstellen, dass wir mit 1 arbeiten, wenn wir die Saite manipulieren. Die Zeichenfolge wird einfach auf einen Doppelpunkt aufgeteilt und abgeschnitten, um die zurückgelassenen Leerzeichen zu entfernen.

Da Sie HTML-Daten ziehen wir auch durch diese Eigenschaften zu erhalten spezifischere Ergebnisse gehen können. Die Absicht war zu 1RedOne Antwort

$web = Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45 
$data = $web.AllElements | Where{$_.TagName -eq "Pre"} | Select-Object -Expand InnerText 
$whois = ($data -split "`r`n`r`n" | select -index 1) -replace ":\s","=" | ConvertFrom-StringData 
$whois.OrgName 

All diese Daten werden gespeichert in dem Text des PRE-Tages in diesem Beispiel zu erhalten. Was ich tun, um die Daten in die Abschnitte aufgeteilt (Abschnitte mit ihnen Leerzeilen Trennung definiert sind. Ich sehe für aufeinanderfolgende Zeilenumbrüche).Die zweite Gruppe von Daten enthält den Organisationsnamen. Speichern Sie das in einer Variablen und ziehen Sie die OrgName als Eigenschaft: $whois.OrgName. Hier ist, was $whois sieht aus wie

Name       Value                               
----       -----                               
Updated      2013-04-02                              
City       Sunnyvale                              
Address      701 First Ave                             
OrgName      Yahoo! Broadcast Services, Inc.                        
StateProv      CA                                
Country      US                                
Ref       http://whois.arin.net/rest/org/YAHO                       
PostalCode      94089                               
RegDate      1999-11-17                              
OrgId       YAHO 
+0

Spot auf! Vielen Dank Matt! :) – Bluz

+0

Blast! Beat mich um eine Minute. Schöne Antwort, wie immer, Matt. – FoxDeploy

+0

@ 1RedOne sieht aus als hätte ich dich um 16 geschlagen! :) – Matt

6

es es sehr einfach whois App nutzen dies für Microsoft setzen App in System32 oder windir und in Powershell verwenden whois Befehl dann get-String erhalten "orgname" wie diese

PS C:\> whois.exe -v 206.190.36.45 | Select-String "Registrant Organization" 

Registrant Organization: Yahoo! Inc. 

ich rate Ihnen diese App, weil mehr Informationen für Ihre Arbeit hat

+0

Jetzt fühle ich mich albern..so konzentrierte sich auf das Lernen Powershell, dass ich über die guten alten MS-DOS-Tools vergessen habe ...! Danke für diesen Vorschlag :) – Bluz

3

Hier gehen Sie, die Möglichkeit, dies zu tun, ist in der Tat ein Invoke-WebRequest zu tun. Wenn wir uns einige der Eigenschaften des Objekts ansehen, das wir von Invoke-WebRequest erhalten, sehen wir, dass PowerShell bereits einige der HTML- und Textelemente für uns analysiert hat.

Alles, was wir tun müssen, ist einige der Werte auszuwählen, mit denen wir gerne arbeiten würden. Wenn wir beispielsweise einen Blick auf das Feld ParsedText werfen, sehen wir diese Ergebnisse.

Html Text

Diese Felder beginnen auf über Linie 30 oder so. Bei meinem Ansatz zur Lösung dieses Problems wissen wir, dass wir auf halber Strecke gute Daten finden. Wenn wir also die Werte aus diesen Zeilen herauskratzen könnten, wären wir auf dem Weg zur Arbeit mit den Daten. Der Code diesen ersten Teil zu erreichen, ist dies:

$url = "https://who.is/whois-ip/ip-address/$ipaddress" 
     $Results = Invoke-WebRequest $url 

     $ParsedResults = $Results.ParsedHtml.body.outerText.Split("`n")[30..50] 

Nun hat Powershell eine Reihe von sehr leistungsfähigen Befehlen Daten in verschiedene Formate zu importieren und zu konvertieren. Wenn wir zum Beispiel das Doppelpunkt-Zeichen ":" durch ein Gleichheitszeichen "=" ersetzen könnten, könnten wir das ganze Chaos an ConverFrom-StringData senden und reiche PowerShell-Objekte haben, mit denen wir arbeiten könnten. Es stellt sich heraus, dass wir leicht tun können, dass der universellen -Replace Operator, wie diese

$Results.ParsedHtml.body.outerText.Split("`n")[30..50] -replace ":","=" 

Ich dachte, Sie könnten dies in Zukunft wieder tun wollen, so habe ich die ganze Sache und machte es zu einer einfachen fünf Linienfunktion für Sie. Wirf das in dein $ Profil und genieße es.

So das fertige Ergebnis sieht wie folgt aus:

Function Get-WhoIsData { 
    param($ipaddress='206.190.36.45') 
    $url = "https://who.is/whois-ip/ip-address/$ipaddress" 
    $Results = Invoke-WebRequest $url 

    $ParsedResults = $Results.ParsedHtml.body.outerText.Split("`n")[30..50] -replace ":","=" | ConvertFrom-StringData 

    $ParsedResults } 

und mit es funktioniert auf diese Weise:

PS C:\windows\system32> Get-WhoIsData -ipaddress 206.190.36.45 
    Name       Value                                    
----       -----                                    
NetRange      206.190.32.0 - 206.190.63.255                              
CIDR       206.190.32.0/19                                 
NetName      NETBLK1-YAHOOBS                                 
NetHandle      NET-206-190-32-0-1                                
Parent       NET206 (NET-206-0-0-0-0)                               
NetType      Direct Allocation                                 
OriginAS                                           
Organization     Yahoo! Broadcast Services, Inc. (YAHO)                           
RegDate      1995-12-15                                  
Updated      2012-03-02                                  
Ref       http=//whois.arin.net/rest/net/NET-206-190-32-0-1                         
OrgName      Yahoo! Broadcast Services, Inc.                             
OrgId       YAHO                                    
Address      701 First Ave                                  
City       Sunnyvale                                   
StateProv      CA                                    
PostalCode      94089  

Sie können dann eine der Eigenschaften wählen Sie normalen Select-Object verwenden möchten oder Where-Object-Befehle. Zum Beispiel, nur die orgName Eigenschaft zu ziehen, dann würden Sie diesen Befehl verwenden:

(Get-WhoIsData).OrgName 
>Yahoo! Broadcast Services, Inc. 
+0

Sie haben es zerschlagen.Ich habe bereits für die vorherige Antwort gestimmt, aber Ihre Eingabe ist definitiv bemerkenswert und sehr lehrreich. Ich dachte früher, dass es großartig wäre, wenn ich genau das tun könnte, was Sie hier beschrieben haben, aber nicht einmal davon geträumt habe zu fragen, dass ich weit davon entfernt war, dies zu tun. Also, nochmals vielen Dank! :) – Bluz

+0

Gerne helfen, und ich hoffe, dass es für Sie nützlich ist. Invoke-WebRequest ist so mächtig, sobald Sie das gelernt haben, sind Sie auf dem besten Weg, in Zukunft eigene Funktionen und Werkzeuge zu entwickeln. :) – FoxDeploy

+0

Wie haben Sie keine Fehler von 'ConvertFrom-StringData' erhalten, da es in diesem Text' ref' doppelte Schlüssel gibt. Ich wollte das auch, aber ich dachte, es wäre über Bord. – Matt

Verwandte Themen