2015-09-07 57 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 
} 
相关问题