我使用的是PSVersion 2.0
,我想知道是否有相當於traceroute
的呢?是否有一個適用於版本2的PowerShell等效tracert?
我知道在PowerShell v4
有Test-NetConnection cmdlet來做tracert但是v2 ?!它可以像做:
Test-NetConnection "IPaddress/HOSTaname" -TraceRoute
感謝
我使用的是PSVersion 2.0
,我想知道是否有相當於traceroute
的呢?是否有一個適用於版本2的PowerShell等效tracert?
我知道在PowerShell v4
有Test-NetConnection cmdlet來做tracert但是v2 ?!它可以像做:
Test-NetConnection "IPaddress/HOSTaname" -TraceRoute
感謝
正如在評論中提到,你可以從tracert.exe
使自己的「窮芒 - 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
輸出:
你絕對是在這裏額外的一英里。做得好! –
謝謝你!我同意@MikeShepard – Sylca
我必須承認我想看看是否有人已經這樣做了。
您可以使用.NET Framework實現不那麼差的芒-的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語句刪除一些危險。 唯一危險這是仍然存在的事實是,我們只有每跳發送一個請求,這可能意味着我們不達到跳由於無辜包裝跌落。 解決這個問題仍然是一個讀者的練習。 提示:(想想循環內的循環)
獎勵:我們現在試圖獲得每跳的DNS條目!
不錯的「原生」方法,太棒了!也許解釋涉及的「危險」? :-) –
所涉及的危險是沒有冗餘(如果單個icmp消息丟失,我們根本沒有得到該特定跳躍的結果)+我們沒有捕獲到PingException。 – MrPaulch
修正了「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
}
您可以使用原來的'tracert.exe'從PowerShell中,你只需要解析輸出自己 –
感謝的人,你幫了我很多! – Sylca