10.10.2023

Powershell ile toplu ping atma

Evet, nmap var. Ama ben bu işi Powershell ile yapmak istiyorum. Evet, firewall'ları açık olanlar cevap vermeyecek.

Hedef, mevcut yerel ağımızdaki (C sınıfı) IP adreslerine ping atarak açık olanları listelemek.

Yerel ağımızdaki IP aralığı 192.168.7.0/24 şeklinde. Son oktet 1'den başlayarak 254'e kadar değişecek.

ping işlemlerini seri olarak (biri bitmeden diğeri başlamayacak şekilde) yapmak istemiyorum. Powershell 5.1 ile paralel yapma şansım da yok. Başka ne yapabilirim? Arkaplan görevleri (background jobs)!

Tek bir hedefi pinglemek (powershell eşdeğeri Test-Connection) için arkaplan görevlerini şu şekilde kullanabilrim:

PS> Start-Job -ScriptBlock {Test-Connection -Computername 192.168.7.1 -Count 1 -Quiet}

Bu işlemi başlattıktan sonra eğer hedef bilgisayar açıksa ve ping'lere cevap verebiliyorsa 1 saniye içinde True değeri döner. Cevap vermiyorsa 4 saniye bekler ve False döner. Ama bu işlemi 254 hedef IP adresi için yapınca işler biraz değişiyor.

PS> 1..254 | % { Start-Job {Test-Connection -Comp "192.168.7.$Using:_ -Quiet -Count 1} } 

Bunun sonucunda 1'den 254'e kadar giden son oktette her bir oktet değeri için yeni bir powershell.exe süreci başlatılır, ve bu sürecin içinde Test-Connection çalıştırılır. Gördüğüm kadarıyla çok fazla bellek ve işlemci ihtiyacı oluyor. Her arkaplan görevinin sadece 1 adet ICMP paketi göndermek ve almak olduğunu düşünerek bu arkaplan görevlerinin hızlıca sonlanacağını düşünüyordum, ama gördüğüm kadarıyla öyle olmuyor. Bunun sebebini bilmiyorum, ama Windows'un görev yönetimi ile ilgili bir darboğaza sebep olduğu yönünde bir izlenim oluştu. Reddit'te  gördüğüm alternatif çözüm önerisi Test-Connection cmdlet'i ile birlikte -AsJob parametresini kullanmak:

PS> 1..254 | % { Test-Connection -Comp "192.168.7.$_" -Count 1 -AsJob } | wait-job | Receive-Job | ? {$_.ResponseTime -ne $null} | select Address, ResponseTime

Bu komutu tek parça olarak çalıştırınca C sınıfı bir subneti taramak 4 sn sürdü. Arka planda neler olduğunu anlamadım. Bu satırı ikiye ayırıp Wait-Job ve devamını ikinci bir satıra yazarsak Receive-Job komutunun bekleyen bütün görevleri listelemesi uzun sürüyor. Acaba sadece benim makinemde mi, bilmiyorum ama bu yöntem hızlı.

Hiç yorum yok: