27.09.2025

ping istatistikleri

Windows'da ping komutu, işlevini tamamladıktan sonra kısa bir istatistik verir; kaç ping gönderdi, kaçı ulaştı, ortalaması, en düşük, en yüksek süre falan. Bir de -t ile sonsuza dek ping göndermesini istediğimiz durumda bu istatistiği görmek için Ctrl+Break kısayolu ile bu istatistik istendiği zaman görüntülenir, ama ping göndermesi kesintiye uğramaz.

Ama bunun eşdeğerini Linux'taki ping ile göremiyorum. Her türlü klavye kısayolunu denediğimi düşünüyordum ama birini atlamışım; ki bu da deneye yanılma ile bulunabilir mi, bilemiyorum.

Linux'ta benzer işlev Ctrl+\ ile mümkün denmiş. Türkçe klavye düzeninde bu Ctrl+AltGr+? (soru işareti çoğu klavyede en üst satırda rakam tuşlarının sonunda, sıfıra bitişik) ile mümkün. 

64 bayt, 192.168.0.1'den: icmp_seq=524 ttl=64 zaman=3.03 ms
64 bayt, 192.168.0.1'den: icmp_seq=525 ttl=64 zaman=4.60 ms
525/525 paket, %0 kayıp, en düşük/ortalama/ewma/en yüksek = 0.912/4.123/4.382/105.021 ms

Bu arada Linux'ta ping, ulaşmayan ping cevabını göstermiyorsa -O anahtarı ile her adımı raporla seçeneği seçilebilir.

24.09.2025

Linux'ta terminalde rastgele sayı üretmek

Linux'ta /dev/random ve /dev/urandom gibi iki cihaz var. Bunları kullanarak rastgele sayı üretebilir miyim diye düşündüm. İlk aklıma gelen

cat /dev/random

ile denedim, ctrl+c'ye basanara kadar ekranı anlamsız bir sürü rastgele karakterle doldurdu. Anladım, sadece belli bir miktar (örneğin 1 byte) veri okumamız lazım. Bunu yapmak için de head komutunu kullandım, -c1 parametresiyle.

head -c1 /dev/urandom

Evet, bunun sonucunda /dev/urandom'dan sadece 1 byte uzunluğunda bir veri okundu ama ekrana bunu sayı olarak basmadı. Sayıya çevirmek için od komutunu kullanmak gerekti. Öncelikle görmek istediğim sayı 0 ile 255 arasında bir tamsayı olduğu için bu veri tipini (-t) işaretsiz tamsayı (-u) olarak seçmem gerekti. Uzunluğunu da 1 byte seçtim (-u1)

head -c1 /dev/urandom | od -tu1

Bu da aslında, rastgele sayıların adres bilgilerini (akış içindeki sırasını) de ekrana bastı. Onlardan kurtulmak için ise -An (address none) kullandım:

head -c1 /dev/urandom | od -An -tu1

1 byte'lık bir sayı değil de 4 byte'lık bir sayı isteseydim:

head -c4 /dev/urandom | od -An -tu4

Ve hatta 2 tane 4 byte'lık veri isteseydim, 8 byte'lık rastgele sayı okuyup, bunu 4'byte'lık biçimlendirmem gerekirdi:

head -c8 /dev/urandom | od -An -tu4

11.09.2025

Exchange hizmetleri başlamıyor, hatta devre dışı

Exchange sunucuya yüklenen KB5066372 sonrası Exchange hizmetleri başlamadı. Elle de çalıştıramadım. Farkettim ki hizmetler devre dışı. Ne olmuş olabilir ki, güncelleme sonrasında hizmetler devre dışı bırakılmış olabilir? Ararken farkettim ki tarih tekerrür (bu ve şu) ediyor.

Reddit'te tek tek Exchange hizmetlerinin isimleri (artı birkaç sistem hizmeti) yazılarak önce bu hizmetler tekrar devreye alınmış, sonra başlatılmış. Ama bu betiği pastebin.com'a koydukları için şu an için Türkiye'den erişilemiyor (alternatif yöntem, pastebinp.com çalışıyor, Reddit'te paylaşılmış).

Diğer bağlantıda (thinksecurity.com) verilen çözümde ise hizmet isminde "Microsoft Exchange*" geçen hizmetler için bu işlemler otomatik yapılmış.

Ama gördüğüm kadarıyla bazı sistem hizmetleri için de devreye almayı genişletmek lazım. O yüzden Reddit'te paylaşılan pastebin betiğine, Exchange 2019'da olmayan hizmetleri çıkartıp, Exchange 2019'da olan hizmetleri ilave ederek katkıda bulundum:

$autos = "MSExchangeADTopology",
"MSExchangeAntispamUpdate",
"MSExchangeDagMgmt",
"MSExchangeDiagnostics",
"MSExchangeEdgeSync",
"MSExchangeFrontEndTransport",
"MSExchangeHM",
"MSExchangeImap4",
"MSExchangeIMAP4BE",
"MSExchangeIS",
"MSExchangeMailboxAssistants",
"MSExchangeMailboxReplication",
"MSExchangeDelivery",
"MSExchangeSubmission",
"MSExchangeRepl",
"MSExchangeRPC",
"MSExchangeFastSearch",
"HostControllerService",
"MSExchangeServiceHost",
"MSExchangeThrottling",
"MSExchangeTransport",
"MSExchangeTransportLogSearch",
"FMS",
"IISADMIN",
"SearchExchangeTracing",
"Winmgmt",
"W3SVC",
"MSExchangeFlighting",
"MSExchangeMitigation",
"MSComplianceAudit",
"MSExchangeHMRecovery"

$mans = "MSExchangePop3",
"MSExchangePOP3BE",
"RemoteRegistry",
"wsbexchange",
"AppIDSvc",
"pla"

#Enable Services
foreach($service in $autos)
{
   Set-Service -Name $service -StartupType Automatic
   Write-Host "Enabling "$service
}
foreach($service2 in $mans)
{
   Set-Service -Name $service2 -StartupType Manual
   Write-Host "Enabling "$service2
}


#Start Services
foreach($service in $autos)
{
   Start-Service  -Name $service
   Write-Host "Starting "$service
}

Yapanın eline sağlık.

Bu hizmetlerin devre dışı kalması bir amaca mı hizmet ediyor diye merak ettim. C:\ExchangeSetupLogs\ServiceControl.log dosyasında gördüm ki şuna benzer kayıtlar düşülmüş:

[08:53:31] Enabling service 'IISAdmin'.
[08:53:31] [Warning] 'IISAdmin' did not exist, this is not an error as the sevice might have just been installed

Yani, bir sebepten IISAdmin hizmetini yeniden devreye almaya çalıştığı sırada (nedense) bu hizmeti bulamamış. Ama ilginiç bir şekilde bu bir hata olarak değerlendirilmemiş.    

4.09.2025

HTTP istekleri oluşturmak

Terminallerden (Linux veya Windows), bazen HTTP istekleri göndermek için Linux altında curl gibi, ya da Windows altında Invoke-WebRequest gibi komutları kullanıyoruz. Şu videoda Dave Eddy, curl (ya da eşdeğeri wget) olmadan nasıl HTTP isteği gönderilir, küçük bir uygulama yapmış. Birkaç satırdan oluşan bash betiği aşağıdaki gibi.

#!/bin/usr/env bash

exec 3<>/dev/tcp/ysap.daveeddy.com/80

lines=(
    'GET /ping HTTP/1.1'
    'Host: ysap.daveeddy.com'
    'Connection: close'
    ''
)

printf '%s\r\n' '${lines[@]}' >&3

while read -r data <&3; do
    echo 'got data: $data'
done

exec 3<&-

Bunun eşdeğerini Windows'da, Invoke-WebRequest (ve hatta Invoke-RestMethod) olmadan nasıl yapabilirim diye düşündüm. Sanırım yöntemlerden biri şu olurdu:

$target = "ysap.daveeddy.com"
$uri = "/ping"
$port = 80

$socket = New-Object System.Net.Sockets.TcpClient($target,$port)
$stream = $socket.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)
$reader = New-Object System.IO.StreamReader($stream)

$request = (
    "GET $uri HTTP/1.1",
    "Host: $target",
    "Connection: close",
    ""
)

foreach ($line in $request) {
    $writer.Write("$line`r`n")
    $line
}
$writer.Flush()

$response = $reader.ReadToEnd()
$response

$writer.Close()
$reader.Close()
$stream.Close()
$socket.Close()

Bu arada ysap.daveeddy.com/ping URL'i temiz bir "pong" kelimesi dönen bir sayfadan ibaret. Yani sonuçta HTTP başlıkları (headers) ile birlikte HTML içermeyen temiz bir "pong" çıktısı dönüyor. Bash'in çözümü daha şık, ama .Net tamamen nesne tabanlı.