2026-10-24

netcat ile sunucu ve dinleyici

Linux altında nc, Windows altında ncat ile yerel ağda küçük bir sunucu ve dinleyici kurulabilir. Basit bir yapı için Linux üzerinde bir sunucu oluşturayım.

nc -l 1234

1234/tcp portu ile dinleme başladı. Ya güvenlik duvarı kapalı olmalı, ya da 1234/tcp için kural oluşturulmalı. Benzer şekilde Windows istemci üzerinde de ncat ile bu porta bağlanalım.

ncat 192.168.7.7 1234

Herşey yolunda giderse bu aşamada karşı tarafa bağlantı gerçekleşir. İki bilgisayardan da bu terminallere girilen karakterler karşı tarafa gönderilir. Yani basit bir chat platformu gibi.

Bir de dosya göndermeyi deneyelim. En basit hali ile sunucuyu alıcı olarak yapılandırıp gelen verileri bir dosyaya kaydetmesini isteyelim. Dosyanın şu an için bir txt dosyası olduğunu varsayıyorum.

ncat -l 1234 > dosya.txt

Gönderen Windows makinede de bir dosya seçip gönderelim. Bunu yapmanın iki yolu var. İlki cmd.exe ile.

ncat.exe 192.168.7.7 1234 < D:\dosya.txt

İkinci powershell ile.

Start-Process "D:\Nmap\ncat.exe" -ArgumentList "192.168.7.7 1234" -NoNewWindow -RedirectStandardInput "D:\dosya.txt"

Bir adım öteye gidiyorum; dosyayı gönderen sunucu olsun. Sunucunun linux olması durumundan başlayalım. Linux'ta bash ile bir oluştalım.


while true; do
    { printf 'HTTP/1.1 200 OK\r\nContent-Type: application/octet-stream\r\nContent-Disposition: attachment; filename="dosya.zip"\r\nContent-Length: '; stat -c %s dosya.zip | tr -d '\n'; printf '\r\nConnection: close\r\n\r\n'; cat dosya.zip; } | nc -l -p 8080
done

Bu yapılandırma ile linux sunucu üzerinde mevcut klasörde bulunan dosya.zip'i indirmek isteyen karşı tarafın yapması gereken, web tarayıcısının adres satırına

http://192.168.7.7:8080

gibi bir ifade yazmak. Üstteki bash dosyasında yapılandırmayı 8080 portu üzerinden yaptım. Tarayıcı bağlanır bağlanmaz bir dosya indirecek. Metin verisi olmasına gerek yok, binary dosyalar da aktarılabilir.

Sunucunun Windows olması durumunda işi powershell ile yürütebiliriz.



$file = 'D:\dosya.zip'
$port = 8080

$listener = [System.Net.Sockets.TcpListener]::new(
    [System.Net.IPAddress]::Any, $port
)
$listener.Start()

Write-Host "Dosya: $file"
Write-Host "Port: $port"
Write-Host "Durdurmak icin Ctrl+C"

while ($true) {
    $client = $listener.AcceptTcpClient()

    try {
        $stream = $client.GetStream()

        $reader = [System.IO.StreamReader]::new(
            $stream, [System.Text.Encoding]::ASCII
        )
        $request = $reader.ReadLine()
        while ($reader.ReadLine() -ne '') {}

        $name = [System.IO.Path]::GetFileName($file)
        $length = (Get-Item -LiteralPath $file).Length

        $header = "HTTP/1.1 200 OK`r`n"
        $header += "Content-Type: application/octet-stream`r`n"
        $header += "Content-Disposition: attachment; filename=`"$name`"`r`n"
        $header += "Content-Length: $length`r`n"
        $header += "Connection: close`r`n`r`n"

        $bytes = [System.Text.Encoding]::ASCII.GetBytes($header)
        $stream.Write($bytes, 0, $bytes.Length)

        $fs = [System.IO.File]::OpenRead($file)
        try {
            $fs.CopyTo($stream)
        }
        finally {
            $fs.Dispose()
        }

        Write-Host "Gonderildi: $request"
    }
    catch {
        Write-Warning $_
    }
    finally {
        $client.Close()
    }
}

netcat demiştim, konunun biraz dışına çıktım.

---

https://anto.online/netcat-command-line-cheat-sheet/
https://anto.online/nmap-command-line-cheat-sheet/

2026-10-23

Firefox klavye kısayolları

Günümün yarısı Firefox ile geçiyor. Klavye kısayolları artık kaçınılmaz. Kopyala/yapıştır gibi basit kısayolların dışında az kullanılan klavye kısayollarını hatırlayabilmek için yazıyorum.

Alt + HomeBaşlangıç sayfasına (Home) git
Ctrl + Shift + VBiçimlendirme olmadan yapıştır
Ctrl + Shift + RÖnbelleği görmezden gelerek sayfayı yeniden yükle
Ctrl + ZGeri al

Ctrl + Y / Ctrl + Shift + Z 

Geri aldığını tekrar yap
Ctrl + G / F3Tekrar bul (Shift ile geriye doğru)
Shift + Tab / Ctrl + oklar

Adres satırında arama motorları seçimine geç

(sonrasında yukarı aşağı yok turşları ile seçim)

Ctrl + E|K|L /Alt + D / F6Arama kutusuna (adres satırı) geç
Ctrl + Shift + PageUp/downSekmeyi sağa/sola taşı
Ctrl + MMevcut sekmenin sesini kapat/aç
Alt + Enter / Ctrl + EnterAdres satırında yazılan adresi yeni sekmede aç
Alt + Shift + Enter / Ctrl + Shift + EnterAdres satırında yazılan adresi arka planda yeni sekmede aç
Ctrl + D    Mevcut sekmeyi yer imlerine ekle
Ctrl + Shift + DAçık tüm sekmeleri yer imlerine ekle
Ctrl + HGeçmişi aç (diğer cihazlardaki geçmiş de görüntülenir)
Ctrl + Shift + H / Ctrl + Shift + OArşivi aç
Ctrl + Shift + BYer imleri araç çubuğunu göster/gizle
Ctrl + Shift + AEklentileri aç
Ctrl + Shift + I / F12Geliştirici araçlarını aç
Ctrl + Shift + STarayıcıdan ekran görüntüsü al
Ctrl + Shift + MResponsive design görünümünü aç
Ctrl + USayfanın kaynağını göster
Shift + DelSeçili otomatik form doldurma girişini sil
F7Klavye ile gezinme kipine geç
F9Okuma kipine geç
Shift + F10Sayfanın bağlam menüsünü aç
N-P veya J-K veya ok tuşlarıPDF görüntüleyicide sayfalar arası geçiş
R ve Ctrl + RPDF görüntüleyicide sayfayı döndür
S / HPDF görüntülenicide seçim / el (hand) aracına geçiş yap
Ctrl + Alt + PPDF görüntülenicide sunum kipine geç (tam sayfa)

2026-10-22

SAPI.SPVoice ile Türkçe konuşan Windows

Powershell ile metni sese dönüştürebiliriz. Varsayılan olarak Tükrçe sesler seçilemiyor ama galiba bir çözümünü buldum.

Normalde şöyle yapılıyor. Önce bir SAPI.SPVoice nesnesi oluşturuluyor.

$SObj = New-Object -ComObject SAPI.SPVoice

Sonra "konuş" demek yeterli.

$SObj.Speak("Hello World")

Ama Türkçe yerelleştirmeli bir Windows 11 Professional'da bile Türkçe ses yok. Sesleri listelemek için

$SObj.GetVoices() | ForEach-Object { $_.GetDescription() }

komutu gerek. Ama benim bilgisayarımda burada sadece Zira (English) görünüyor. Buna rağmen

Ayarlar > Zaman ve dil > Dil ve bölge

altında "Dil" bölümünde Türkçe, metin okumak için listeleniyor. Ayrıca

Ayarlar > Erişilebilirlik > Ekran okuyucusu > Ekran okuyucusunun sesi > Ses seçin

bölümünde Tolga sesi de görünüyor ve seçili.

Biraz registry'yi inceleyince

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens

altında Tolga sesini buldum. Bunu kullanmak için

$ses_adi = "MSTTS_V110_trTR_Tolga"
$reg_yolu = "HKLM\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens\$ses_adi"

reg copy $reg_yolu "HKLM\SOFTWARE\Microsoft\Speech\Voices\Tokens\$ses_adi" /s /f
reg copy $reg_yolu "HKLM\SOFTWARE\WOW6432Node\Microsoft\Speech\Voices\Tokens\$ses_adi" /s /f

kullanarak kullanılabilir Tolga token bilgisini ilgili yerlere kopyaladım. Bunun sonucunda

$SObj.GetVoices() | ForEach-Object { $_.GetDescription() }

kullanarak Tolga (Türkçe) sesini listeleyebildim. Ses seçimi yaparak bir konuşma yapan fonksiyon oluşturdum.

function Out-Speak {
    param(
    	[string]$text="Merhaba Dünyalı"
    )
    $SObj = New-Object -ComObject SAPI.SPVoice
    $SObj.voice = $SObj.GetVoices() | where {$_.GetDescription() -match "Tolga"}
    $SObj.Speak($text)
}

2026-10-21

Write-Progress

Powershell'de uzun süren görevlerin durumunu görüntülemeye yarayan bir "progress bar" gösterimi var. En basit haliyle işlerin ne durumda olduğunu göstermek için


...
Write-Progress -Activity "Aciliyor..."
...
Write-Progress -Activity "Isleniyor..."
...
Write-Progress -Activity "Kapaniyor..."
...

gibi bir kullanım mümkün. Sürecin neresinde olduğumuz konusunda genel bir fikir vermek için yeterli. Ama bu aşamada bir progress bar yok. Bunu yapabilmek için elimizdeki işin tümünün kaç birim olduğunu, şu bu işlerin ne kadarının işlendiğini bilmemiz gerek. Çok basit bir for döngüsü için


for ($i=0;$i -lt 10;$i++) {
	Write-Progress -Activity "Sayiyor..." -PercentComplete $($i*10)
    Start-Sleep 1
}

Çok hızlı saymasın diye, yavaşlatmak amacıyla Start-Sleep kullandım. Evet, bu bir ilerleme çubuğu verir, çünkü döngünün toplamda 10 kere tekrarlayacağı ve şu anda kaçıncı döngüde olduğumuz ($i) bilgisi elimizde var. Ama kafama birşey takıldı; ilerleme çubuğu ne zaman kayboluyor? -PercentComplete %100'e gelse bile kaybolmuyor. Ancak komut sonlandığında kayboluyor. Yani terminalde sadece

Write-Progress -Activity "Calisiyor..."

Yazıp enter'a basınca ilerleme çubuğu o kadar kısa bir sürede gösterilip kayboluyor ki göremiyorum bile. Peki, bir tuşa basılmasını bekleyen Read-Host ile kullansam?


Write-Progress -Activity "Calisiyor...";Read-Host

Faydasız, yine görünmedi. Peki Read-Host yerine Start-Sleep kullansam?


Write-Progress -Activity "Calisiyor...";Start-Sleep 1

Evet, şimdi 1 saniye boyunca bir ilerleme çubuğu görüntülendi. Buradan çıkan sonuç; -PercentComplete parametresi %100'e gelse bile görüntülenme devam ediyor, ancak console host kontrolü devralıncaya kadar. Klavye'den bir giriş yapılması gereken durumlarda progress bar kapanıyor. Ama bu kadar ile bitmiyor, Write-Progress'in bir de -Completed parametresi var. Bu sadece bu parametre progress bar'ı ekrandan kaldırabiliyor. Örnek:


Write-Progress -Activity "Calisiyor...";Start-Sleep 1;Write-Progress -Activity "Bitti" -Completed;Start-Sleep 2

Bunu çalıştırıp Enter'a basınca 1 saniye boyunca ekranda "Calisiyor..." yazıyor, sonrasında -Completed parametresi olan bir Write-Progress kullanımı olduğu için progress bar kayboluyor, 2 saniye de ekranda hiç progress bar gösterimi olmadan bekliyorum.

Write-Progress'in bundan biraz daha fazla ayrıntıya sahip parametreleri var. Örneğin -Activity parametresine ek bilgi sağlamak için -Status parametresi kullanılabilir. Bu parametre ile sağlanan bilgi, -Activity ile sağlanan bilginin altında görüntülenir.


Write-Progress -Activity "Calisiyor..." -Status "Dosya acildi"

gibi.

Aynı anda birden fazla progress bar gösterilmesi gereken durumlarda -Id paramteresi ile hangi progress bar'ın güncelleneceğini seçebiliriz.


for ($i=0; $i -lt 5; $i++) {
   Write-Progress -Id 1 -Activity "i degiskeni artiyor" -Status "i=$i" -PercentComplete $($i*10)
   for ($j=0; $j -lt 5; $j++) {
      Write-Progress -Id 2 -Activity "j degiskeni artiyor" -Status "j=$j" -PercentComplete $($j*10)
      Start-Sleep -Milliseconds 100
   }
}

Ama burada iki progress bar da aynı seviyede yer aldı. Birisinin (i) diğerinin (j) üstü olduğunu göstermek için -Parent parametresi var. Bunun yaptığı tek şey, aslında j döngüsüne ait olan Write-Progress'i soldan girintili bir şekilde göstermek. j'nin ilerlemesini gösteren progress bar'a ait Write-Progress'in -Parent parametresine, üstü olan i döngüsünün Write-Progress'inin Id'sini vermek gerek. Aşağıdaki gibi.


for ($i=0; $i -lt 5; $i++) {
   Write-Progress -Id 1 -Activity "i degiskeni artiyor" -Status "i=$i" -PercentComplete $($i*10)
   for ($j=0; $j -lt 5; $j++) {
      Write-Progress -Id 2 -Parent 1 -Activity "j degiskeni artiyor" -Status "j=$j" -PercentComplete $($j*10)
      Start-Sleep -Milliseconds 100
   }
}

2026-10-20

VS Code ve powershell remoting

Uzak bir bilgisayara

Enter-PSSession -Computername sunucu01

ile bağlanıp çalışıyorum. Bazen uzaktaki bilgisayarda bir metin dosyasını düzenlemek istiyorum. Yeni çıkan edit aracı çok güzel, ama powershell remoting ile çalıştıramadım. Üstelik de sunucularda yok.

Bu işe bir çözüm ararken farkettim [1, 2] ki uzak bilgisayardaki bir dosyayı yerel bilgisayarda kurulu VS Code ile düzenleyebiliyorum.

Tek yapmam gereken VS Code'un kendi terminalinden uzaktaki bilgisayara bağlanıp

psedit dosya.ps1

komutunu vermek. Uzaktaki dosya çalıştığım bilgisayarda geçici bir klasöre aktarılıp VS Code ile açılıyor. Kaydettiğimde de tekrar uzaktaki bilgisayara aktarılıyor.

Burada VS Code'un powershell terminali konusu biraz kritik. VS Code'un powershell eklentisi yüklü olmalı. Bazen VS Code penceresinin içinde birden fazla powershell terminali açılmış olabiliyor. Bu durumda hangisinin eklentiye ait olan terminal olduğunu görebilmek için

$host.name

komutunun çıktısının

Visual Studio Code Host

olması gerek.

2026-10-19

flatpak uygulamalarını terminalden çalıştırma

Windows'da bir dosyayı VS Code ile açmak için

code dosya.txt

demek yeterli. Fedora'da VS Code'un açık kaynaklı sürümünü, flatpak ile kurdum; code-oss. Ama terminalden ne code ne de code-oss kullanarka doğrudan ulaşamıyorum. Flatpak ile kurulan uygulamarlın çalışması için

flatpak run com.visualstudio.code-oss

yapmak gerekiyor.

Daha kısa bir yol olarak bir alias oluşturabilirim. Bash için .bashrc dosyasına, zsh için .zshrc dosyasına öyle bir satır gerekli:

alias code='flatpak run com.visualstudio.code-oss'

Bunun sonucunda her yerden

code dosya.txt

yazmak yeterli.

Başka bir seçenek de flatpak export klasöründeki dosyaya kısayol oluşurmak. Flatpak kurulumu export konumu

~/.local/share/flatpak/exports/bin/

veya

/var/lib/flatpak/exports/bin

olabilir. Henüz yoksa ~/.local/bin klasörü oluşturup içine şu şekilde bir kısayol oluşurabilirim.

ln -s /var/lib/flatpak/exports/bin/com.visualstudio.code-oss ~/.local/bin/codeoss

2026-10-18

Eski sunuculara güncell ssh bağlantısı

Güncel bir ssh istemci ile eski bir ssh sunucuya bağlanınca şöye bir mesaj ile bağlantı yapılamayabilir:

Unable to negotiate with 192.168.7.77 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

Zaman içinde değişen güvenlik standartları sebebiyle istemci ile sunucu arasında bir fark oluşmuş. İki yol var; sunucu güvenlik standartlarını yükseltmek -ki bu daha iyi ama zor olan yöntem- ve istemciye eski standartları kabul etmesini söylemek. Ben ikincisini yapıyorum çünkü sunucum popüler ve dağıtım depoları olan bir linux değil eski ve cihaza özgü bir işletim sistemi.

Windows 10'un 18-02 sürümünden bu yana var olan OpenSSH-Client paketi ile ssh bağlantısı yapıyorum, Windows Terminalden. Bu sebeple yaptığım ssh komutuna küçük bir parametre eklemek:

ssh user@192.168.7.7 -o HostKeyAlgorithms=+ssh-rsa

Linux'tan bağlansaydım da aynı komut geçerli olacaktı. Ayrıca bir anahtar ile kimliğimi doğruluyor olsaydım PubkeyAcceptedAlgorithms=+ssh-rsa ekleyerek

ssh user@192.168.7.7 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa

yapmam gerekebilirdi. -o ile HostkeyAlgorithms birleşik de yazılabilir.