linux etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
linux etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

2026-05-03

Bash ile tekrarlayan dosyaları bulma

Linux'ta terminalde tekrarlayan dosyaları bulmak için

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

Yapılanların kısa özeti:

find .                # mevcut klasör ve alt klasörleri ara
! -empty          # boş olmayanları bul
-type f        # dosyaları bul
-exec md5sum {} + # bulunan dosyaların md5 hash'lerini hesapla
| sort        # önceki komutun çıktısını sırala
| uniq -w32    # sıralananların içinde ilk 32 karakter için benzersizlik (uniq) karşılaştırması yap
-d          # tekrarlayanları göter
-D          # tekrarlayan tüm kopyaları listele 

2026-04-08

Bluetooth kulaklığın batarya seviyesi - Linux

Android'de olduğu gibi Linux'ta da bluetooth kulaklığın batarya seviyesini görebilsek güzel olurdu. GNOME arayüzünde yok, bilemiyorum KDE veya diğer grafik arayüzlerde var mıdır. Ama terminalde görmek için önce

bluetoothctl

ile etkileşimli ortama girmek lazım. Sonra bu etkileşimi ortamda

devices

diyerek bağlı cihazları listelemek gerek. Burada istediğimiz cihazın MAC adresine benzeyen xx:xx:xx:xx:xx:xx formatındaki cihaz kimliğini kopyaladıktan sonra

info xx:xx:xx:xx:xx:xx

ile ayrıntılarını sorgulamak lazım. Burada en altta (hep böyle midir?)

Battery percentage: 0x47 (70)

gibi bir noktada batarya seviyemiz görülebilir. İlk yazan, tahmin edilebileceği gibi onaltılık sistemde 70'in karşılığı. Alışık olduğumuz onluk sistemde yüzde değerimiz 70.

2026-04-04

Linux terminalde basit matematik işlemleri

Powershell'de her türlü matematiksel işlem yapılırken bash veya diğer shell'lerde 4 işlem bile mümkün değil. Ama çözümü var: bc

bc yazıp giriş yaptığımızda etkileşimli bir ortam karşılıyor bizi. Çıkmak için quit yazmak gerek, exit işe yaramıyor. ctrl+c de işe yarar. Buraya girmeden basit bir şekilde sonucu öğrenmek için

echo '33*47' | bc

yazılabilir.

Başka bir yöntem dolar ($) operatöründen sonra çift parantez kullanmak ve parantezler ile ifade arasında bir karakter boşluk bırakmak:

echo $(( 33*47 ))

Trigonometrik fonksiyonlar gibi karışık işler için python kullanılabilir. Ama varsayılan shell'de math kütüphanesi gelmediği için önce import math ile kütüphaneyi eklemek gerek:

import math
math.sin(math.pi/2)

 

2026-02-27

Kablosuz erişim noktası bilgilerini bulmak (Linux)

Şuradaki işlemlerin eşdeğerlerini Linux'ta yapmak istiyorum. Olasılıklardan biri nmcli kullanmak. nmcli, network manager olarak bilinen çoğu linux dağıtımında kurulu gelen ağ bağlantılarını yönetmek için kullanılan sistemin komut satırı (ncurse) bileşeni.

Aşağıdaki komut, bilgisayardaki ağ arayüzlerinin durumlarını gösterir. Ethernet arayüzleri için kablonun takılı olup olmadığını, wifi için ise mevcut kablosuz bir ağa bağlı olup olmadıklarını gösterir.

nmcli dev status

Şu komut ise bilgisayarın daha önce bağlanmış olduğu kablosuz ağları gösterir. Bu, Windows'daki hatırlanan kablosuz ağ profillerinin karşılığıdır.

nmcli con show

Bilgisayardaki arayüzlerin listesini almak için

nmcli dev

ve hatta daha da ayrıntılı görebilmek için

nmcli dev show

kullanılabilir. Örnek bir çıktı şöyle olur:

GENERAL.DEVICE:              wlp4s0
GENERAL.TYPE:                wifi
GENERAL.HWADDR:              <mac-address>
GENERAL.MTU:                 1500

GENERAL.STATE:               100 (bağlandı)
GENERAL.CONNECTION:          <ssid>
GENERAL.CON-PATH:            /org/freedesktop/NetworkManager/ActiveConnection/2
IP4.ADDRESS[1]:              192.168.1.5/24
IP4.GATEWAY:                 192.168.1.100
IP4.ROUTE[1]:                dst = 192.168.1.0/24, nh = 0.0.0.0, mt = 600
IP4.ROUTE[2]:                dst = 0.0.0.0/0, nh = 192.168.1.1, mt = 600

IP4.DNS[1]:                  8.8.8.8
IP4.DNS[2]:                  1.1.1.1

IP6.ADDRESS[1]:              <ip6-address>
IP6.GATEWAY:                 --
IP6.ROUTE[1]:                dst = fe80::/64, nh = ::, mt = 1024

Arayüzlerden birini seçip sadece onunla ilgili ayrıntıları görebilmek için

nmcli dev show wlp4s0

Etrafımızdaki kablosuz ağların listesini görmek için

nmcli dev wifi

Bu komutun çıktısında asterisk karakteri "*" ile gösterilen satır, bizim bağlı olduğumuz ağdır. Bu satırın BSSID sütununda bağlı olduğumuz erişim noktasının MAC adresi benzeri kimliği yer alır.

 

2026-02-18

Linux sunucuyu kim yeniden başlatmış veya kapatmış

Yetkili bir kullanıcı tarafından yeniden başlatılan sunucunun journalctl loglarında şöyle bir satır görünür:

Aug 19 08:38:16 bilgisayaradi systemd-logind[1235]: The system will reboot now!

Burada bilgisayaradi ile gözüken alan kullanıcı adı değil, bilgisayar adı.

Bu olay kaydı systemd-logind birimi tarafından oluşturulmuş. Bu birim tarafından oluşturulan diğer kayıtları da görmek için

journalctl -u systemd-logind

kullanılabilir. Faydalı diğer kayıtlar şunlar olabilir: 

Nov 13 04:44:48 bilgisayaradi systemd-logind[1009]: The system will power off now! 
Nov 13 04:44:48 bilgisayaradi systemd-logind[1009]: System is powering down. 
journalctl -g "Linux version"

Burada gözüken tarih ve saatten +/- birkaç 10 saniye etrafını kısıtlayarak yapılacak bir aramada aşağıdaki regex ile kullanıcı adına erişilebilir.

journalctl --since "Nov 13 04:44:00" --until "Nov 13 04:45:00" | grep -e "Session [[:digit:]] of User"
Nov 13 04:44:47 bilgisayaradi systemd[1]: Stopping session-2.scope - Session 2 of User metin... 
Nov 13 04:44:47 bilgisayaradi systemd[1]: Stopped session-2.scope - Session 2 of User metin.

 Ayrıca sunucumuzun yeniden başlama olaylarını listelemek için de

journalctl --list-boots

komutu kullanılabilir. Sentetik bir yöntem olarak, journalctl kayıtlarında ilk yer alan 

Aug 14 14:53:07 arsiv kernel: Linux version 6.8.0-71-generic (buildd@lcy02-amd64-053) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ub

gibi bir ifadeyi de arayabilirdim:

journalctl -g " Linux version "

 

2026-01-04

localsearch-3

Fedora'yı 43'e yükselttikten sonra durup dururken localsearch hakkında bilgi sahibi oldum. Sürekli çalışan bir süreç, localsearch-extractor-3 adında.

journalctl --user -u localsearch-3

ile bakınca çok sayıda "extractor subprocess died unexpectedly" hataları vermiş.

Hepsi localsearch adındaki bir paketin bileşenleri. Eski adı tracker/mine gibi birşey. 43 sürüm sonrası localsearch olmuş. /home klasörü altındaki dosya içeriklerini endekslemeyi amaçlıyor. Ama ben böyle otomatik arka plan işlerini sevmiyorum.

Bu işi devre dışı bırakmak için

systemctl --user stop localsearch-3.service
systemctl --user mask localsearch-3.service

komutları gerek.

Gnome aracılığıyla kapatmaktan bahsedilmiş ama galiba sürüm 43 sonrası bu ayarlar artık yok. Bunun yerine

gsettings set org.gnome.desktop.search-providers disable-external true

gibi bir yöntem var, ama sadece hizmeti devre dışı bırakmakla yetindim. 

Tamamen kaldırmak için ise

sudo dnf remove localsearch localsearch-extractors

önerilmiş. Ama ilk başta durumu izlemek için kaldırmadım, zaten sistemimde localsearch-extractors paketi de kurulu değildi. 

2025-12-22

Fedora'da dnf5'e geçiş

Fedora yükseltmek için şu adımları kullanıyordum. Sürüm 41'den sürüm 43'e yükseltirken bana

sudo dnf system-upgrade reboot

yerine

sudo dnf5 offline upgrade

kullanmamı önerdi. Meğer sürüm 41'de artık bu yönde bir değişiklik olmuş. dnf5 hala tavsiye edilen kararlı yapıda değil, ama muhtemelen sürüm 45'te artık dnf yerine kullanılabilir olacak.

Diğer tüm durumlar için dnf ana komutu dnf5 ile değiştirmek yeterli:

dnf5 install firefox
dnf5 remove firefox
dnf5 search firefox
dnf5 upgrade

gibi. 

2025-12-19

dnf update sırasında çıkan "Downloading successful, but checksum doesn't match." mesajı

Buna hata mı demek lazım, uyarı mı, yoksa bilgilendirme mesajı mı?

Fedora üzerinde dnf update yaparken rastladım. Şuna benzer bir mesajdı:

$ sudo dnf check-upgrade
Updating and loading repositories:
 Fedora 41 - x86_64 - Updates                               100% |  67.2 KiB/s |  31.8 KiB |  00m00s
 Signal Messaging Devel Project (Fedora_41)                 100% |   2.3 KiB/s |   1.7 KiB |  00m01s
 Fedora 41 openh264 (From Cisco) - x86_64                   100% |   3.6 KiB/s | 989.0   B |  00m00s
 Brave Browser                                              100% |  15.5 KiB/s |   2.0 KiB |  00m00s
 ProtonVPN Fedora Stable repository                         100% |   4.8 KiB/s |   3.7 KiB |  00m01s
 Fedora 41 - x86_64                                         100% | 182.4 KiB/s |  32.7 KiB |  00m00s
 Fedora 41 - x86_64 - Updates                               100% |   1.3 MiB/s |   4.6 MiB |  00m03s
>>> Downloading successful, but checksum doesn't match. Calculated: e96bd9b4c272be2d9c7d4a656b7ae322
>>> Downloading successful, but checksum doesn't match. Calculated: e96bd9b4c272be2d9c7d4a656b7ae322

Genelde böyle bir hata olursa paket güncellenmemiş olur. Hangi paket güncellenmedi acaba diye bakmak istedim, /var/log/dnf.log dosyasına, ama burada hata olduğuna dair bir bilgi bulamadım. Bu kelime ile yaptığım aramalarda şu adreste bulduğum açıklamaya göre güncelleştirme sırasında kullanılan yansı sunucuda geçici bir uyumsuzluk olabileceği, dnf'in hata yaşanan paketi yeniden indirerek veya yansı sunucuyu değiştirerek sorunu giderebileceği belirtilmiş. Hatta böyle bir uyumsuzluğun belki de yansı sunucunun üzerindeki paketlerin diğer bir yansı üzerinden güncellenmesi sırasında karşılaşılabileceği ifade edilmiş.

Sonuç olarak tekrar dnf upgrade yaptığımda hata oluşmadı, loglarda da sorun olduğuna dair bir kayıt bulamadım. Yani geçici bir durummuş, çözülmüş. 

2025-12-15

Rocky Linux sunucu kurulumu sonrası ilk ayarlar

Bir Rocky Linux sunucu kurdum. Kurulum sonrası bazı ilk ayarlar yapılması gerek.

İlk iş TCP/IP ayarlarını yapmak. Tercihen nmtui ile IP ataması yaptım. Ama elle atama yapacaksak /etc/NetworkManager/SystemConnections klasöründe her ethernet kartımıza ait bir dosya bulunur, örneğin ens192.nmconnection şeklinde. Bu dosyanın içeriği şöyle olabilir:

[connection]
id=ens192
uuid=<8-4-4-4-12 karakterlik-hex-dizi>
type=ethernet
autoconnect-priority=-999
interface-name=ens192
timestamp=1765795716

[ethernet]

[ipv4]
method=manual
address1=192.168.1.5/24
gateway=192.168.1.1
dns=1.1.1.1;8.8.8.8;
dns-search=domain.com
ignore-auto-dns=true
never-default=true

DNS sunucuların yeri yine /etc/resolv.conf dosyası. 

İkinci iş klavye düzenini değiştirmek. Hazırdaki klavye düzenlerini görmek istersek

localectl list-keymaps

ve bunların arasından örneğin Türkçe-Q klavye düzenini seçmek istiyorsak da

localectl set-keymap trq

komutu ile ilerleyebiliriz.

OpenSSH kurulu mu diye kontrol ettim:

rpm -q openssh

kurulu gelmiş. Hizmet çalışıyor mu diye baktım:

systemctl status sshd

o da çalışıyor. Windows makinemden ssh'a bağlantı denedim:

ssh metin@192.168.1.5

Bana daha önce 192.168.1.5 IP adresine sahip başka bir cihaza ait parmak izinin C:\Users\metin\.ssh\known_hosts dosyasında bulunduğunu söyleyen bir uyarı mesajı verdi. Evet, eski sunucuya ait satırı bu dosyadan silmek istiyorum. Hızlı bir şekilde

cd C:\users\metin\.ssh
cat known_hosts | ? {$_ -notmatch 192.168.1.5} | sc known_hosts2

yaptım. Yedek olması açısından mevuct dosyayı koruyarak yeni dosyayı devreye aldım:

ren known_hosts known_hosts.old2025
ren known_hosts2 known_hosts

Bu noktadan sonra önce sunucuya genel anahtarımızı aktaralım (bir tane yaratmak için tıklayın).

scp genel_anahtarim metin@192.168.1.5:/user/metin

Bu anahtarı authorized_keys dosyasının içine eklemeliyim. Var olan bir authorized_keys dosyası varsa, buna eklemek için ya cat komutunun birleştirme yeteneğini kullanarak

cat genel_anahtarim .ssh/authorized_keys > .ssh/authorized_keys

ya da çift yönlendirme operatörünü kullanabilirim:

cat genel_anahtarim >> .ssh/authorized_keys

Varsayılan olarak parola ile giriş (hatta boş parolalar bile) ve root ile erişim açıktır. Bunları kapatmak için /etc/ssh/sshd_config.d klasörünün içine bir dosya oluşturup aşağıdaki içerik girilebilir.

# Varsayilan portu degistir
Port 2122
# Sadece SSH protokol 2
Protocol 2

# Root kesinlikle giremez
PermitRootLogin no

# Sadece belirli kullanıcılar
AllowUsers metin

# Boş parola kabul etme
PermitEmptyPasswords no

# Parola ile giriş YOK
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no

# Sadece anahtar tabanlı giris
PubkeyAuthentication yes

# Yetkisiz forwarding kapali
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

# Oturum guvenligi
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2

# Loglar daha ayrintili olsun
LogLevel VERBOSE 

Dağıtımdan dağıtıma değişebilir ama, bu klasör içinde bazı dosyalar olabilir. Örneğin benim sunucumda bu klasörde

-rw-------. 1 root root 412 Jul 20 20:00 40-redhat-crypto-policies.conf
-rw-------. 1 root root 307 Jul 20 20:00 50-redhat.conf

gibi dosyalar vardı. Ben 60-ek-yapilandirma.conf gibi bir dosya oluşturarak bunun içine girdim.

Hepsi bitince OpenSSH hizmetini yeniden başlattım.

systemctl restart sshd

Sonrasında parola ile girmeyi denedim, olmadı -tam da istediğim gibi. Sonra özel anahtarım ile girmeyi denedim:

ssh -i ozel_anahtarim metin@192.168.1.5

ve başarılı. 

2025-12-12

Linux komut geçmişi

Terminalden bağlandığım bir linux sunucu var. Oluşturduğum yeni bir kullanıcı için komut geçmişi (history) yok gibi görünüyor. Bunu etkinleştirmek istiyorum.

Önce kullandığım shell'i kontrol etmem gerek.

echo $SHELL
/usr/bin/sh

ile bash'i değil, sh'i kullandığımı gördüm. Bunu değiştirerek bash yaptım.

chsh -s $(which bash)

sonra bir kez bağlantımı kesip (konsoldan bağlıysam oturumu kapatıp) tekrar oturum açmam gerek.

Sonrasında yine echo $SHELL komutunu kullanarak çıkışta /usr/bin/bash gördüm.

Komut geçmişi, profilin altında .bash_history dosyasına yazılır. Bu dosya yoksa

echo $HISTFILE

komutu ile önce bu değişkenin varlığını kontrol etmek, yoksa

export HISTFILE=~/.bash_history

satırını .bashrc dosyasına eklemek, arkasından etkinleştirmek için

source ~/.bashrc

çalıştırmak gerek.

Komut geçmişini sınırlandıran değişkenler kontrol edilebilir:

echo $HISTSIZE
echo $HISTFILESIZE

Bu değişkenlerin ilki hafızada tutulacak komut geçmişi sayısı, ikincisi diskte tutulacak geçmiş sayısıdır.

zsh için de benzer bir şekilde ~/.zsh_history dosyasında tutulur. HISTSIZE değişkeni aynen geçerlidir, HISTFILESIZE yerine SAVEHIST değişkeni kullanılır.

Daha iyi bir yöntem için audit kullanılabilir. 

2025-11-25

Linux sunucuya yapılan bağlantıları görmek

SSH örneği üzerinden gidelim. Varsayılan SSH portu tcp/22. Çoğu dağıtımda ss komutu yüklü gelir.

ss -tpn

Çok fazla bağlantı varsa sadece 22 portu süzmek için

ss -tpn | grep :22 
-t : tcp
-p : bağlantı ile ilişkili prosesleri göster
-n : portları nümerik olarak listele, hizmet isimlerini gösterme

Başka bir yöntem lsof kullanmak.

sudo lsof -i

Sadece 22 numaralı portu görmek için aşağıdaki notasyon yeterli.

sudo lsof -i :22

ssh bağlantılarına özel who veya w komutları da kullanılabilir.

who
user1    pts/0        2025-11-25 14:15 (192.168.17.8)
w komutu da aşağıdaki gibi
w
 15:59:14 up  3:44,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU  WHAT
user1              192.168.17.8         14:15          3:29m  0.00s  0.04s sshd: user1 [priv]

Linux için son seçenek diye birşey olmaz, daha çok seçenek vardır eminim ama bir de last komutu var.

last
user1     pts/0        192.168.17.8       Tue Nov 25 14:15   still logged in

Eğer son satırda "still logged in" yazıyorsa bağlantı hala devam ediyordur. Aşağıdaki gibiyse bağlantı 14:30'da sonlanmış demektir.

last
user1     pts/0        192.168.17.8       Tue Nov 25 14:15 - 14:30 (00:15)


2025-10-19

openfortivpn

Linux bir makineden Fortinet firewall'a VPN yaparken kullanılabilecek bir yöntem, openfortivpn.

Fedora altında yüklenmesi gereken paket de openfortivpn.

sudo dnf install openfortivpn

Kurulum tamamlandıktan sonra /etc/openfortivpn/config altındaki dosyayı düzenlememiz gerek.

hedef sistemin adı (veya IP adresi), port numarası ve firewall'daki kullanıcı adını yazmak tamam. Ama bir de trusted-cert alanına yazılması gereken bir thumbprint var. Bunu edinmek için tarayıcımızla https kullanarak firewall'a bağlanıp (VPN portu üzerinden) sertifikanın sha256 parmak izini (thumbprint) almamız gerek. Daha sonra bu parmak izini octetler arasında tire "-", iki nokta üstüste ":" karakteri veya boşluk olmadan  olmadan bitişik bir şekilde yazmak gerek.

trusted-cert = 1234567890ABCDEF...

Bu adımdan sonra bağlantı yöntemi komut satırından. Bunu bir bash betiğine koymak da olası:

sudo openfortivpn fortinet.sirket.com:443 -u kullanici.adi

 

2025-09-27

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.

2025-09-24

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

2025-09-04

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ı.

2025-06-16

Linux'ta find komutu

Dosya aramak. Bitmez tükenmez bir ihtiyaç. Bütün işlevlerin de yıllar önce tasarlanmış bir find komutunun yetenekleri ile hala yapılabiliyor olması ilginç.

En çok kullandığım işlev, en son değişiklik tarihine göre dosya aramak; muhtemelen kısmi dosya ismi ile birlikte. Son 1 gün içinde değişen dosyaları bulmak için

find . -type f -iname '*.txt' -mtime 1

Burada en sondaki rakamın yanında artı veya eksi olmadığından tam 1 gün önce (1 ile 2 arasındakileri; yani 24 saat ve 48 saat önce değişenleri) değişenleri bul demek. 1 günden önce değişenler demek için

find . -type f -iname '*.txt' -mtime +1

Bir günden daha önce (24 saatten daha kısa süre önce) değişenleri bul demek için ise

find . -type f -iname '*.txt' -mtime -1

demek gerek.

Son 10 dakika içinde değişen (oluşan) dosyaları görmek için

find . -type f -mmin -10

Son 10 dakika ile 30 dakika arasında değişen dosyaları görmek için

find . -type f -mmin +10 -mmin -30 

Daha net bir tarih ve saat bilgisi için -newermt parametresi kullanılabilir. Örneğin 1 Ocak 2024'ten sonra değişen txt uzantılı dosyalar için

find . -type f -newermt '2024-01-01'
find . -type f -newermt 'Jan 1 2024'
find . -type f -newermt '2024-01-01 01:25 PM'

gibi komutlar kullanılabilir. En sondaki örnek diğerleri ile eşdeğer değil, saat farkı ile farklı sonuçlar üretir, sadece ISO tarih biçimindeki saat bilgisini göstermek için verdim.

Bu parametre daha esnek kullanıma da sahip. Örneğin

find . -type f -newermt 'yesterday'
find . -type f -newermt '2 weeks ago'
find . -type f -newermt '6 hours ago'

Hatta belli bir tarih aralığı için ünlem "!" işareti aralık sonu belirlenebilir. Örneğin 1 Ocak 2024 ile 31 Nisan 2024 arasını belirtmek için

find . -type f -newermt "2024-01-01" ! -newermt "2024-04-31"

Bir dosyanın oluşturulmasından daha sonra oluşturulmuş (düzenlenmiş) dosyaları bulmak da mümkün. Örnek dosyamız /home/metin/referans_dosya olsun. 

find . -type f -newer /home/metin/referans_dosya

Tüm tarih verileri sistemin yerel saatine göre yapılıyor.

Başka bir kriter de dosya boyutu. Genelde ihtiyacım olan belli bir boyutun üzerinde olan dosyalar. 2 GB'tan büyük ISO dosyaları için

find . -type f -iname '*.iso' -size +2G

Tam tersi, 2 GB'tan küçük iso dosyaları için ise, tahmin edilebileceği gibi boyut belirten 2'nin yanındaki artı '+' işaretini eksiye '-' çevirerek

find . -type f -iname '*.iso' -size -2G

find komutu sonrasında dosyanın ls ile gösterilen ayrıntılarını görmek istiyorsak iki seçenek var. -exec kullanmak, ya da find'in kendi -ls parametresini kullanmak. İki örnek

find . -type f -newermt 'yesterday' -exec ls -l {} \;
find . -type f -newermt 'yesterday' -ls

İlk örneğin sonundaki \; işareti ls komutunu bulunan her dosya için ayrı ayrı çalıştır demek. Her birini toplayıp tek seferde ls çalıştırmak için bunun yerine \+ kullanmak gerek.

İkinci örnekteki -ls parametresi, normal ls komutunun çıktısına göre 2 fazla sütun veri üretir. İlk sütun bulunan dosyanın dosya sistemindeki inode numarası. İkinci sütun ise bu dosyanın dosya sisteminde kaç blok kapladığını gösterir (sistemimizde bir blok kaç byte diye bakmak istersek sudo tune2fs -l /dev/sda). Aslında ls -li komutu ile de bu sütunlara ulaşmak mümkün.

Sadece bulunduğumuz klasördeki dosyalarla ilgileniyorsak ve en son değiştirilenleri bulmak istiyorsak

ls -ltR

Bu şekilde değiştirilme zamanlarına (-t) göre sıralar. En son değiştirilenlerin en altta yer alması için (-R) kullanılır, yoksa en son değişenler en üstte yer alır. Sadece son değişen 10 tane ile ilgileniyorsak

ls -lt | head

kullanabiliriz. Dosya boyutuna göre sıralamak için -S kullanılabilir. Bu da varsayılan olarak büyükten küçüğe sıralar. En büyük 5 dosyayı listelemek için

ls -lS | head -5

---

https://www.cyberciti.biz/faq/linux-unix-osxfind-files-by-date/

2025-05-30

Linux güvenlik duvarı ve logları

Debian sunucu üzerinde ufw güvenlik duvarını etkinleştirmiş, 

sudo ufw enable

bazı hizmetler için port açma kuralları oluşturmuştum.

sudo ufw allow to <hizmet|port>

Ara sıra güvenlik kayıtlarını incelemek için

sudo journalctl -u <hizmet> --since "1 week ago"

gibi bir komut ile son 1 hafta içinde gerçekleşen olaylara ait kayıtları inceliyordum. Şüpheli/ısrarcı bir IP adresinden gelen istekler ile ilgili engelleme kuralları koyuyordum.

sudo ufw deny from 192.168.5.0/24 to any

Normalde /var/log/ufw.log dosyasında engellenen IP adreslerine ait kayıtlarının olması gerekir.

sudo tail /var/log/ufw.log

Bir süre sonra farkettim ki ufw ile önce istediğim hizmeti etkinleştirip altında da ufw deny komutu ile eklediğim IP engellemeleri aslında engellenmiyor. Bunun sebebi de genel olarak güvenlik duvarı kuralları içinde işlemin üstteki kuraldan başlaması ve aşağıya doğru inmesi. Trafiğe uyan bir kural bulunduktan sonra alttaki diğer kurallar işletilmiyor. Yani üstte hizmete izin veren bir kural varsa attaki engellemeler çalışmıyor. Bunun için engelleme kurallarını izin verme kurallarının üstüne koymaya başladım, aşağıdaki gibi

sudo ufw insert 1 deny from 192.168.5.0/24 to any

Bunun sonucunda da /var/log/ufw.log dosyasına artık kayıtlar düşmemeye başladı. Acaba engellemeler çalışmıyor mu diye düşündüm ama

sudo iptables -L ufw-user-input -v -n

komutuyla baktığımda ilgili engelleme kurallarının yanıdaki sayaçların arttığını gördüm. Yani engelleme kuralları çalışıyor ama log kayıtları oluşmuyordu. Arka planda iptables altyapısını kullanan ufw, izin, engelleme ve log işlemleri için karmaşık bir kural yapısına sahip. insert ile üst sıraya eklediğim kurallar log yapısını bozuyor. Buna çözüm olarak önce ufw-user-input zincirine iptables komutu ile yeni LOG kuralı eklemeyi (her IP için ayrı kural) denedim.

sudo iptables -I ufw-user-input 1 -s 192.168.5.0/24 -j LOG --log-prefix "[UFW BLOCK] "

Ama her yeni IP adresi engelleme kurallı eklediğimde ufw, iptables kurallarını sıfırlayıp kuralları tekrar baştan yazdığı için log kuralım da siliniyordu. Bu duruma çözüm olarak LOG kurallarını ufw-user-input zincirine değil de ufw-before-input zincirine eklemeyi, ekleme işlemini de /etc/ufw/before.rules dosyası aracılığıyla yapmayı buldum. Bu şekilde kuralları değiştirdiğimde eski LOG silinmiyor. before.rules dosyasında *filter anahtar kelimesi ile başlayan ve # End required lines ile biten bölümden hemen sonra

-A ufw-before-input -s 192.168.5.0/24 -j LOG --log-prefix "[UFW BLOCK] " --log-level 4

ekliyorum. Bunu da engellediğim her IP adresi için ayrı ayrı yapıyorum.

iptables altyapısı aslında /var/log/ufw.log gibi bir dosyaya log yazmıyor. ufw nasıl oluyor da buraya yazabiliyor, merak ettim. Loglar aslında

/var/log/syslog
/var/log/messages
/var/log/kern.log

yazılıyor. Bu loglar üzerinden de

grep "UFW BLOCK" /var/log/kern.log

gibi sorgular ile ufw engellemeleri görülebiliyor. Bunların ufw.log dosyasında da görünmesini sağlayan ise rsyslog sistemi. /etc/rsyslog.d/20-ufw.conf dosyasında aşağıdaki gibi bir satır var.

:msg,contains,"[UFW " /var/log/ufw.log

Bu satır sayesinde syslog kayıtlarında içinde "[UFW " geçen logların /var/log/ufw.log dosyasına yönlendirilmesi sağlanmış.

Dahası, bir süredir iptables altyapısı yerine nftables'ın kullanıldığı farkettim.

sudo iptables -V

komutu sonucunda parantez içinde nf_tables yazıyorsa evet, iptables yerine nftables kullanıyoruz demek. Bunun yerine parantez içinde legacy yazıyor veya olabilir ya da parantez içinde bir ifade olmayabilir. Bu, iptables olduğunun göstergesi. Bir süre daha uyumluluk modunda iptables komutları ile çalışabiliriz. Ama bu uyumluluk modu uzun sürmeyecek. Sistemde nftables'ın izlerini aramak için önce kurulu paketlerin içinde nftables arayabilirim. Debian tabanlı sistemlerde

dpkg -l | grep -E "(iptables|nftables|ufw)"
veya Fedora türevlerinde
rpm -qa | grep -E "(iptables|nftables|firewalld)"

Yüklü modüllerde nf_tables olup olmadığına bakabilirim

lsmod | grep nf_tables

systemd birimlerine bakabilirim

systemctl list-units --type=service | grep -E "(iptables|nftables|firewall)">

Son olarak nftables kullanan bir sistemde

nft list ruleset

ile json formatında bir çıktı kural kümesini gösterir. Diğer bazı kontroller:

update-alternatives --display iptables
ls -l /etc/alternatives/iptables

2025-11-25 Ek: Doğrudan güvenlik duvarı konusu olmasa bile SSH üzerinden yapılan veya başarısız bağlantı girişimlerini görmek için /var/log/auth.log dosyası incelenebilir.

Başarılı bir bağlantı için aşağıdaki gibi kayıtlar düşülür:

Jun 18 09:16:39 <hostname> sshd[27915]: Accepted password for <user> from <ip> port 55560 ssh2
Jun 18 09:16:39 <hostname> sshd[27915]: pam_unix(sshd:session): session opened for user <user>(uid=1000) by (uid=0)
dns systemd-logind[568]: New session 1000 of user <user>

Başarısız bağlantı girişimleri için aşağıdaki gibi kayıtlar görülür, auth.log dosyasında: 

Jun 18 09:40:10 <hostname> sshd[28047]: Failed password for <user> from <ip> port 55797 ssh2
Jun 18 09:40:09 <hostname> sshd[28047]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=<ip>  user=<user>
Jun 18 09:40:19 <hostname> sshd[28047]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=<ip>  user=<user>

3 başarısız parola girişiminden sonra bağlantı kapatılır (connection reset). Bu durumda şöyle bir satır düşer loglara:

Jun 18 09:40:19 <hostname> sshd[28047]: Connection reset by authenticating user <failing_user> <failing_ip> port 55797 [preauth] 

Bu gibi kayıtları journalctl ile incelemek için

journalctl -u ssh -b -e

.

2025-02-22

bash prompt'a en son komut çalışma süresini eklemek

bash promptumda en son çalışan komutun ne kadar süre ile çalıştığını gösteren bir alan olmasını istiyorum. Bu işi doğrudan yapmanın bir yönteminin olmadığını öğrendim. Ama dolaylı olarak yapmanın yolları var. trap ve PROMPT_COMMAND gibi yönergeler işe yarıyor. Yazdığımız komutu çalıştırmadan hemen önce çalışacak fonkisyonu trap ile bildiriyoruz. Promptu oluşturacak fonksiyonu işe PROMPT_COMMAND yönergesi ile belirliyoruz. Örneğin preexec adında bir fonksiyon oluşturup içeriğini şöyle belirledim.

function preexec() {
    export TIMER_START=(date +%s%3N)
}

Bu fonksiyon, TIMER_START adında bir değişken oluşturup, içeriğini 01.01.1970'ten bu yana geçen milisaniyelere eşiytleyecek. Sonra da precmd adında bir fonksiyon oluşturup içeriğini aşağıdaki gibi belirledim.

function precmd() {
local TIMER_END=(date +%s%3N)
local TIME_DIFF=$((TIMER_END-TIMER_START))
if (( TIME_DIFF > 1000 )); then
local DURATION="$((TIME_DIFF / 1000)) s"
else
local DURATION="$TIME_DIFF ms"
fi
export PS1="($DURATION) $ "
}

Bundan sonra preexec'i trap ile, precmd'yi de PROMPT_COMMAND ile belirliyorum.

trap 'preexec' DEBUG 
PROMPT_COMMAND=precmd

Ancak bundan sonra farkettim ki preexec fonksiyonu birden fazla işliyor. Benim tespit ettiğim bir kez komutu çalıştırmadan önce, bir kez de komutu çalıştırdıktan sonra. Bu ilginç bir konu ama derinlerine dalmak istemedim. Basit bir şekilde bir komut için sadece 1 kez çalıştırılmasını bir değişkenle denetledim.

preexec_active=0
function preexec() {
    if [[ $preexec_active -eq 0 ]]; then
    export TIMER_START=(date +%s%3N)
    preexec_active=1
    fi
}

Benzer şekilde precmd fonksiyonunun içine de bu değişkeni eski haline döndürecek bir satır ekledim.

function precmd() {
    local TIMER_END=(date +%s%3N)
   local TIME_DIFF=$((TIMER_END-TIMER_START))
    if (( TIME_DIFF > 1000 )); then
        local DURATION="$TIME_DIFF s"
   else
        local DURATION="$TIME_DIFF ms"
   fi
   export PS1="($DURATION) $ "
    preexec_active=0
}

Bu şekilde herşey istediğim gibi oldu.

2025-02-04

KDE'de 3 parmak kaydırma hareketi algılama

Touchpad'in fareye göre biraz zor olduğu doğru. Ama avantajları da var. Örneğin bir süredir standart olan iki parmak kaydırma ile sayfada gezinme güzel birşey. Son zamanlarda 3 parmak ile kaydırma işlevlerinin de Windows ve Gnome'da çok kullanışlı olmasının ardından x11 ile birlikte kullandığım KDE'ye de bu özellikleri kazandırmak için ne yapabilirim diye bakınca touchegg touche paketlerinin varlığından haberdar oldum.

sudo pacman -S touchegg touche

komutuyla kurdum. Kurduktan sonra touchegg hizmetini etkinleştirdim.

sudo systemctl enable touchegg.service --now

Sonra da bir kez yeniden başlattım, --now'a rağmen -gerekiyormuş. Açıldıntan sonra başlat menüme eklenen Touche simgesine tıklayınca Touche penceresi açıldı:

 

Buradan 3 parmak hatta 4 parmak kaydırma hareketleri için istediğim atamaları yapabildim.

2025-02-03

Manjaro'da gerek duyulmayan paketleri silmek

Manjaro linux'umdaki root partition'ım doldu. Biraz yer açmam lazım. En büyük yer kaplayan klasör de pacman cache'i.

pacman -Qdtq

komutu ile bir sürü pakete artık ihtiacımın olmadığnı görüyorum. Ama bir ara Linus Sebastian'ın başına geldiği gibi birşeyin benim başıma da gelmemesi için öncelikle bütün paketlerin gerçekten ihtiyaç duyulmadığını görmek, hatta şüphe ettiklerimi kapsam dışında bırakmak istiyorum. Öncelikle -Qdtq ile listelenen paket listesini bir dosyaya atıyorum.

pacman -Qdtq > gereksizler.txt

Belki ilk iş olarak bu listeye bakabilir, tereddüt ettiklerimi çıkarabilirim. Sonra bu listedeki her paketin -Qi ile listelenen bilgilerine bakmak istiyorum. Örneğin electron paketi gereksiz olarak listelenmiş. -Qi ile baktığımda şöyle bir çıkış alıyorum:

pacman -Qi electron
İsim                   : electron
Sürüm                  : 1:33-1
Açıklama               : Meta package providing the latest available stable Electron
                         build
Mimari                 : any
URL                    : https://electronjs.org
Lisanslar              : MIT
Gruplar                : Hiçbiri
Sağlananlar            : Hiçbiri
Bağımlılıkları         : electron33
Tercihli Bağımlılıklar : Hiçbiri
İhtiyaç Duyulanlar     : Hiçbiri
İsteğe Bağlı           : Hiçbiri
Çakışıyor              : Hiçbiri
Değiştirilenler        : Hiçbiri
Kurulum Boyutu         : 0,00 B
Paketçi                : Caleb Maclennan <alerque@archlinux.org>
İnşa Tarihi            : Sal 15 Eki 2024 23:10:40
Yükleme Tarihi         : Paz 01 Ara 2024 09:31:58
Yükleme Sebebi         : Başka bir paketin bağımlılığı olarak kurulmuş
Kurulum Betiği         : Hayır
Doğrulayan             : İmza

Burada İhityaç Duyulanlar alanı, bu pakete ihtiyaç duyan diğer paketleri, İsteğe Bağlı alanı ise çalışmak temel işlevleri için değil de bazı ek işlevler için bu pakete ihtiyaç duyabilecek paketleri listeliyor. Görüldüğü gibi electron için bu liste boş. Dolayısıyla silinebilir. Bu listedeki 92 paket için bunu elle yapmak istemiyorum. Otomatize etmek için

xargs -r pacman -Qi < gereksizler.txt | grep -E "İhtiyaç Duyulanlar|İsteğe Bağlı"

gibi bir komutla her paket için ekrana "İhtiyaç Duyulanlar" ve "İsteğe Bağlı" alanlarını yazdırıp gerçekten gereksiz olup olmadığını görmek istiyorum.

Bu adım gereksiz, evet. Ama emin olmak istedim. Nihayet, her paket için hem ihtiyaç duyulan hem de isteğe bağlı satırda "Hiçbiri" yazdığını görünce tümünü birden silme komutunu verdim.

sudo pacman -Rsn $(pacman -Qdtq)