我需要使用powershell通过whois解析IP地址.我的公司过滤端口43和WHOIS查询,因此我必须使用的解决方法是让powershell使用https://who.is等网站,读取http流并查找与IP地址匹配的组织名称.
到目前为止,我已经设法将网页读入PowerShell(例如,在yahoo.com上使用WHOIS),这是https://who.is/whois-ip/ip-address/206.190.36.45
所以这是我的片段:
$url=Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做:
$url.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False HtmlWebResponseObject Microsoft.PowerShell.Commands.WebResponseObject
Run Code Online (Sandbox Code Playgroud)
我看到这个对象有几个属性:
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;}
Run Code Online (Sandbox Code Playgroud)
但每次我尝试像这样的命令
$url.ToString() | select-string "OrgName"
Run Code Online (Sandbox Code Playgroud)
Powershell返回整个HTML代码,因为它将文本字符串解释为一个整体.我找到了一个解决方法,将输出转储到一个文件中,然后通过一个对象读取文件(所以每一行都是一个数组的元素),但是我要检查数百个IP,这样才不是最佳的创建文件.
我想知道如何阅读网页https://who.is/whois-ip/ip-address/206.190.36.45的内容并获得以下内容:OrgName:Yahoo! 广播服务公司
而且只是那条线.
非常感谢您的帮助!:)
Mat*_*att 12
有很多可能更好的方法来解析这个问题,但是你在当前的逻辑上走在正确的轨道上.
$web = Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45
$web.tostring() -split "[`r`n]" | select-string "OrgName"
Run Code Online (Sandbox Code Playgroud)
Select-String因为它之前是一条长串而正在返回比赛.使用-split我们可以分解它以获得您期望的回报.
OrgName: Yahoo! Broadcast Services, Inc.
Run Code Online (Sandbox Code Playgroud)
之后的一些字符串操作将获得更清晰的答案.同样,有很多方法可以解决这个问题
(($web.tostring() -split "[`r`n]" | select-string "OrgName" | Select -First 1) -split ":")[1].Trim()
Run Code Online (Sandbox Code Playgroud)
我曾经Select -First 1作为select-string可以返回多个对象.它只会确保我们在操作字符串时使用1.字符串只是在冒号上拆分并修剪以删除留下的空格.
由于您要提取HTML数据,我们还可以浏览这些属性以获得更具体的结果.这样做的目的是得到1RedOne的回答
$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
Run Code Online (Sandbox Code Playgroud)
PRE在此示例中,所有数据都存储在标记的文本中.我所做的是将数据分成它们的部分(部分用空行分隔它们.我寻找连续的换行符).第二组数据包含组织名称.将其存储在变量中并将其OrgName作为属性拉出:$whois.OrgName.这是什么$whois样的
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
Run Code Online (Sandbox Code Playgroud)
如果您愿意处理这些哈希表,也可以将该哈希表制作成自定义对象.
[pscustomobject]$whois
Updated : 2017-01-28
City : Sunnyvale
Address : 701 First Ave
OrgName : Yahoo! Broadcast Services, Inc.
StateProv : CA
Country : US
Ref : https://whois.arin.net/rest/org/YAHO
PostalCode : 94089
RegDate : 1999-11-17
OrgId : YAHO
Run Code Online (Sandbox Code Playgroud)
小智 9
它很简单,使用whois app这是微软把应用程序在System32或windir和powershell使用whois命令然后get-string得到"orgname"这样
PS C:\> whois.exe -v 206.190.36.45 | Select-String "Registrant Organization"
Registrant Organization: Yahoo! Inc.
Run Code Online (Sandbox Code Playgroud)
我建议你这个应用程序,因为有更多的工作信息
在这里,执行此操作的方法实际上是执行Invoke-WebRequest. 如果我们查看从 Invoke-WebRequest 获取的对象的一些属性,我们可以看到 PowerShell 已经为我们解析了一些 HTML 和文本。
我们所要做的就是挑选一些我们想要使用的值。例如,看看这个ParsedText领域,我们会看到这些结果。

这些字段从大约第 30 行左右开始。在我解决这个问题的方法中,我们知道我们会在页面中间找到这样的好数据,所以如果我们可以从这些行中抓取值,我们就可以开始处理数据了。完成这第一部分的代码是这样的:
$url = "https://who.is/whois-ip/ip-address/$ipaddress"
$Results = Invoke-WebRequest $url
$ParsedResults = $Results.ParsedHtml.body.outerText.Split("`n")[30..50]
Run Code Online (Sandbox Code Playgroud)
现在,PowerShell 拥有许多非常强大的命令来导入和转换数据为各种格式。例如,如果我们只能用等号 '=' 替换 ':' 冒号字符,我们可以将整个混乱发送给ConverFrom-StringData并拥有丰富的 PowerShell 对象来使用。事实证明,我们可以使用通用-Replace运算符轻松做到这一点,就像这样
$Results.ParsedHtml.body.outerText.Split("`n")[30..50] -replace ":","="
Run Code Online (Sandbox Code Playgroud)
我想你将来可能想再做一次,所以我把整个事情变成了一个简单的五行函数。把它扔进你的 $Profile 并享受。
所以最终的结果是这样的:
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 }
Run Code Online (Sandbox Code Playgroud)
并以这种方式使用它:
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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用普通的 Select-Object 或 Where-Object 命令选择您想要的任何属性。例如,要仅提取 orgName 属性,您可以使用以下命令:
(Get-WhoIsData).OrgName
>Yahoo! Broadcast Services, Inc.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18498 次 |
| 最近记录: |