2015-09-07 59 views
10

我使用的是PSVersion 2.0,我想知道是否有相當於traceroute的呢?是否有一個適用於版本2的PowerShell等效tracert?

我知道在PowerShell v4有Test-NetConnection cmdlet來做tracert但是v2 ?!它可以像做:

Test-NetConnection "IPaddress/HOSTaname" -TraceRoute 

感謝

+1

您可以使用原來的'tracert.exe'從PowerShell中,你只需要解析輸出自己 –

+0

感謝的人,你幫了我很多! – Sylca

回答

17

正如在評論中提到,你可以從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-Tabletracert輸出:

enter image description here

+0

你絕對是在這裏額外的一英里。做得好! –

+0

謝謝你!我同意@MikeShepard – Sylca

3

我必須承認我想看看是否有人已經這樣做了。

您可以使用.NET Framework實現不那麼差的芒-的traceroutePowerShell腳本

這裏的底漆,即工作速度快,但很危險。 另外,沒有統計。

# 
# 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條目!

+0

不錯的「原生」方法,太棒了!也許解釋涉及的「危險」? :-) –

+1

所涉及的危險是沒有冗餘(如果單個icmp消息丟失,我們根本沒有得到該特定跳躍的結果)+我們沒有捕獲到PingException。 – MrPaulch

4

修正了「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 
} 
相關問題