是否有适用于版本 2 的 PowerShell 等效 tracert?
Is there a PowerShell equivalent tracert that works in version 2?
我正在使用 PSVersion 2.0
,我想知道是否有与 traceroute
等效的产品?
我知道 PowerShell v4
上有 Test-NetConnection cmdlet 可以执行 tracert 但 v2?!可以这样做:
Test-NetConnection "IPaddress/HOSTaname" -TraceRoute
谢谢
如评论中所述,您可以通过解析 tracert.exe
:
的输出来创建自己的 "poor-mans-PowerShell-tracert"
function Invoke-Tracert {
param([string]$RemoteHost)
tracert $RemoteHost |ForEach-Object{
if($_.Trim() -match "Tracing route to .*") {
Write-Host $_ -ForegroundColor Green
} elseif ($_.Trim() -match "^\d{1,2}\s+") {
$n,$a1,$a2,$a3,$target,$null = $_.Trim()-split"\s{2,}"
$Properties = @{
Hop = $n;
First = $a1;
Second = $a2;
Third = $a3;
Node = $target
}
New-Object psobject -Property $Properties
}
}
}
默认情况下,powershell 在列表中格式化具有 5 个或更多属性的对象,但您可以使用 Format-Table
:
获得类似 tracert
的输出
我必须承认我想看看是否有人已经这样做了。
您可以使用 .Net Framework 将 not-so-poor-mans-traceroute 作为 Powershell 脚本
这是一本入门书,见效快,但很危险。
另外,没有统计数据。
#
# Mid-Waged-Mans-Tracert
#
$ping = new-object System.Net.NetworkInformation.Ping
$timeout = 5000
$maxttl = 64
$address = [string]$args
$message = [System.Text.Encoding]::Default.GetBytes("MESSAGE")
$dontfragment = false
$success = [System.Net.NetworkInformation.IPStatus]::Success
echo "Tracing $address"
for ($ttl=1;$i -le $maxttl; $ttl++) {
$popt = new-object System.Net.NetworkInformation.PingOptions($ttl, $dontfragment)
$reply = $ping.Send($address, $timeout, $message, $popt)
$addr = $reply.Address
$rtt = $reply.RoundtripTime
try {
$dns = [System.Net.Dns]::GetHostByAddress($addr)
} catch {
$dns = "-"
}
$name = $dns.HostName
echo "Hop: $ttl`t= $addr`t($name)"
if($reply.Status -eq $success) {break}
}
编辑:
通过添加 catch 语句消除了一些危险。
唯一仍然存在的危险是我们每跳只发送一个请求,这可能意味着我们不会到达由于 innocent 包裹掉落而跳跃。
解决这个问题仍然是读者的练习。
提示:(想想循环中的循环)
奖励:我们现在尝试获取每一跳的 dns 条目!
修复了“Mid-Waged-Mans-Tracert”版本中的一些错误,将其模块化,并添加了一些定制件。 @MrPaulch 的 PoC 很棒。
function Invoke-Traceroute{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=1)]
[string]$Destination,
[Parameter(Mandatory=$false)]
[int]$MaxTTL=16,
[Parameter(Mandatory=$false)]
[bool]$Fragmentation=$false,
[Parameter(Mandatory=$false)]
[bool]$VerboseOutput=$true,
[Parameter(Mandatory=$false)]
[int]$Timeout=5000
)
$ping = new-object System.Net.NetworkInformation.Ping
$success = [System.Net.NetworkInformation.IPStatus]::Success
$results = @()
if($VerboseOutput){Write-Host "Tracing to $Destination"}
for ($i=1; $i -le $MaxTTL; $i++) {
$popt = new-object System.Net.NetworkInformation.PingOptions($i, $Fragmentation)
$reply = $ping.Send($Destination, $Timeout, [System.Text.Encoding]::Default.GetBytes("MESSAGE"), $popt)
$addr = $reply.Address
try{$dns = [System.Net.Dns]::GetHostByAddress($addr)}
catch{$dns = "-"}
$name = $dns.HostName
$obj = New-Object -TypeName PSObject
$obj | Add-Member -MemberType NoteProperty -Name hop -Value $i
$obj | Add-Member -MemberType NoteProperty -Name address -Value $addr
$obj | Add-Member -MemberType NoteProperty -Name dns_name -Value $name
$obj | Add-Member -MemberType NoteProperty -Name latency -Value $reply.RoundTripTime
if($VerboseOutput){Write-Host "Hop: $i`t= $addr`t($name)"}
$results += $obj
if($reply.Status -eq $success){break}
}
Return $results
}
至少 PS 5 你可以
Test-Netconnection whosebug.com -TraceRoute
我正在使用 PSVersion 2.0
,我想知道是否有与 traceroute
等效的产品?
我知道 PowerShell v4
上有 Test-NetConnection cmdlet 可以执行 tracert 但 v2?!可以这样做:
Test-NetConnection "IPaddress/HOSTaname" -TraceRoute
谢谢
如评论中所述,您可以通过解析 tracert.exe
:
function Invoke-Tracert {
param([string]$RemoteHost)
tracert $RemoteHost |ForEach-Object{
if($_.Trim() -match "Tracing route to .*") {
Write-Host $_ -ForegroundColor Green
} elseif ($_.Trim() -match "^\d{1,2}\s+") {
$n,$a1,$a2,$a3,$target,$null = $_.Trim()-split"\s{2,}"
$Properties = @{
Hop = $n;
First = $a1;
Second = $a2;
Third = $a3;
Node = $target
}
New-Object psobject -Property $Properties
}
}
}
默认情况下,powershell 在列表中格式化具有 5 个或更多属性的对象,但您可以使用 Format-Table
:
tracert
的输出
我必须承认我想看看是否有人已经这样做了。
您可以使用 .Net Framework 将 not-so-poor-mans-traceroute 作为 Powershell 脚本
这是一本入门书,见效快,但很危险。 另外,没有统计数据。
#
# Mid-Waged-Mans-Tracert
#
$ping = new-object System.Net.NetworkInformation.Ping
$timeout = 5000
$maxttl = 64
$address = [string]$args
$message = [System.Text.Encoding]::Default.GetBytes("MESSAGE")
$dontfragment = false
$success = [System.Net.NetworkInformation.IPStatus]::Success
echo "Tracing $address"
for ($ttl=1;$i -le $maxttl; $ttl++) {
$popt = new-object System.Net.NetworkInformation.PingOptions($ttl, $dontfragment)
$reply = $ping.Send($address, $timeout, $message, $popt)
$addr = $reply.Address
$rtt = $reply.RoundtripTime
try {
$dns = [System.Net.Dns]::GetHostByAddress($addr)
} catch {
$dns = "-"
}
$name = $dns.HostName
echo "Hop: $ttl`t= $addr`t($name)"
if($reply.Status -eq $success) {break}
}
编辑:
通过添加 catch 语句消除了一些危险。 唯一仍然存在的危险是我们每跳只发送一个请求,这可能意味着我们不会到达由于 innocent 包裹掉落而跳跃。 解决这个问题仍然是读者的练习。 提示:(想想循环中的循环)
奖励:我们现在尝试获取每一跳的 dns 条目!
修复了“Mid-Waged-Mans-Tracert”版本中的一些错误,将其模块化,并添加了一些定制件。 @MrPaulch 的 PoC 很棒。
function Invoke-Traceroute{
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true,Position=1)]
[string]$Destination,
[Parameter(Mandatory=$false)]
[int]$MaxTTL=16,
[Parameter(Mandatory=$false)]
[bool]$Fragmentation=$false,
[Parameter(Mandatory=$false)]
[bool]$VerboseOutput=$true,
[Parameter(Mandatory=$false)]
[int]$Timeout=5000
)
$ping = new-object System.Net.NetworkInformation.Ping
$success = [System.Net.NetworkInformation.IPStatus]::Success
$results = @()
if($VerboseOutput){Write-Host "Tracing to $Destination"}
for ($i=1; $i -le $MaxTTL; $i++) {
$popt = new-object System.Net.NetworkInformation.PingOptions($i, $Fragmentation)
$reply = $ping.Send($Destination, $Timeout, [System.Text.Encoding]::Default.GetBytes("MESSAGE"), $popt)
$addr = $reply.Address
try{$dns = [System.Net.Dns]::GetHostByAddress($addr)}
catch{$dns = "-"}
$name = $dns.HostName
$obj = New-Object -TypeName PSObject
$obj | Add-Member -MemberType NoteProperty -Name hop -Value $i
$obj | Add-Member -MemberType NoteProperty -Name address -Value $addr
$obj | Add-Member -MemberType NoteProperty -Name dns_name -Value $name
$obj | Add-Member -MemberType NoteProperty -Name latency -Value $reply.RoundTripTime
if($VerboseOutput){Write-Host "Hop: $i`t= $addr`t($name)"}
$results += $obj
if($reply.Status -eq $success){break}
}
Return $results
}
至少 PS 5 你可以
Test-Netconnection whosebug.com -TraceRoute