Skip to content

Linux Komut Satırı Kapsamlı Rehber (Comprehensive Linux CLI Guide)

Full-stack geliştiriciler için pratik Linux terminal referans rehberi.

Ne zaman terminal kullanmalıyım?

Her geliştirici için zorunlu -- sunucu yönetimi, terminal işlemleri, otomasyon

⚠️ Başlangıçta zor ama zamanla vazgeçilmez

❌ --


Dosya ve Dizin Yönetimi (File & Directory Management)

ls -- Dizin Listeleme (Directory Listing)

bash
# Temel kullanim
ls                  # Mevcut dizini listele
ls -l               # Detayli liste (izinler, boyut, tarih)
ls -la              # Gizli dosyalar dahil
ls -lh              # Boyutlari okunabilir formatta goster (KB, MB, GB)
ls -ltr             # Tarihe gore sirala, en yenisi sonda
ls -lS              # Boyuta gore sirala, en buyugu basta
ls -R               # Alt dizinler dahil recursive listele
ls -1               # Her dosya bir satirda
ls -ld */           # Sadece dizinleri listele

Faydalı flag kombinasyonları:

bash
ls -lahS            # Gizli dahil, okunabilir boyut, boyuta gore sirali
ls -lt --color=auto # Tarih siralama + renkli cikti
ls -la --group-directories-first  # Dizinleri basta goster

cd -- Dizin Değiştirme (Change Directory)

bash
cd /var/log         # Mutlak yol ile git
cd ..               # Bir ust dizine cik
cd ../..            # Iki ust dizine cik
cd ~                # Home dizinine don (veya sadece cd)
cd -                # Onceki dizine geri don
cd /                # Root dizine git

cp -- Kopyalama (Copy)

bash
cp dosya.txt yedek.txt              # Dosya kopyala
cp -r klasor/ yedek_klasor/         # Dizin kopyala (recursive)
cp -i dosya.txt hedef/              # Uzerine yazma onay iste
cp -p dosya.txt hedef/              # Izinleri ve tarihleri koru
cp -u kaynak.txt hedef.txt          # Sadece yeniyse kopyala
cp -v dosya1 dosya2 hedef/          # Verbose: ne yapildigini goster
cp -a kaynak/ hedef/                # Archive mode: her seyi koru (recursive + preserve)

mv -- Taşıma ve Yeniden Adlandırma (Move & Rename)

bash
mv dosya.txt klasor/                # Dosya tasi
mv eski_isim.txt yeni_isim.txt      # Yeniden adlandir
mv -i dosya.txt hedef/              # Uzerine yazma onay iste
mv -n dosya.txt hedef/              # Uzerine yazma (hayir)
mv -v dosya.txt hedef/              # Verbose
mv *.log arsiv/                     # Tum log dosyalarini tasi

rm -- Silme (Remove)

bash
rm dosya.txt                        # Dosya sil
rm -r klasor/                       # Dizin sil (recursive)
rm -f dosya.txt                     # Zorla sil (onay sorma)
rm -rf klasor/                      # Dizini zorla sil (DIKKATLI KULLAN)
rm -i *.tmp                         # Her dosya için onay iste
rm -v dosya.txt                     # Silinen dosyayi goster

Güvenlik notu: rm -rf / veya rm -rf * gibi komutlardan kaçının. Önemli dosyaları silmeden önce ls ile kontrol edin.

bash
# Isme gore ara
find /home -name "*.txt"                    # .txt uzantili dosyalari bul
find . -iname "*.jpg"                       # Buyuk/kucuk harf duyarsiz
find . -name "*.log" -type f                # Sadece dosyalari bul
find . -type d -name "node_modules"         # Sadece dizinleri bul

# Boyuta gore ara
find . -size +100M                          # 100MB'den buyuk dosyalar
find . -size -1k                            # 1KB'den kucuk dosyalar
find . -size +10M -size -100M               # 10-100MB arasi

# Tarihe gore ara
find . -mtime -7                            # Son 7 gunde degistirilen
find . -mtime +30                           # 30 gunden eski
find . -newer referans.txt                  # referans.txt'den yeni dosyalar
find . -mmin -60                            # Son 60 dakikada degistirilen

# Izinlere gore ara
find . -perm 755                            # Tam 755 izne sahip
find . -perm -u+x                           # Calistirilabilir dosyalar

# Bulunanlara islem uygula
find . -name "*.tmp" -delete                # Bul ve sil
find . -name "*.sh" -exec chmod +x {} \;    # Bul ve calistir izni ver
find . -name "*.log" -exec gzip {} \;       # Bul ve sikistra
find . -type f -empty -delete               # Bos dosyalari sil

# Haric tutma
find . -name "*.js" -not -path "*/node_modules/*"
find . -path "./vendor" -prune -o -name "*.php" -print

tree -- Dizin Ağacı (Directory Tree)

bash
tree                        # Mevcut dizini agac olarak goster
tree -L 2                   # Sadece 2 seviye derinlik
tree -d                     # Sadece dizinleri goster
tree -a                     # Gizli dosyalar dahil
tree -I "node_modules|.git" # Belirli dizinleri haric tut
tree -h                     # Dosya boyutlarini goster
tree --dirsfirst            # Dizinleri basta goster
tree -P "*.py"              # Sadece .py dosyalarini goster
bash
# Symbolic (soft) link
ln -s /var/log/syslog ~/loglar/syslog       # Sembolik link olustur
ln -sf hedef yeni_link                       # Varsa uzerine yaz

# Hard link
ln dosya.txt dosya_hardlink.txt              # Hard link olustur

# Linkleri kontrol etme
ls -la                                       # -> ile sembolik linkleri gor
readlink -f link_adi                         # Linkin gercek hedefini goster

Soft link vs Hard link:

ÖzellikSoft LinkHard Link
Farklı partitionEvetHayır
Dizinlere linkEvetHayır
Orijinal silinirseKırık linkÇalışmaya devam
InodeFarklıAynı

Metin İşleme (Text Processing)

cat -- Dosya İçeriğini Görüntüleme (View File Contents)

bash
cat dosya.txt                   # Dosya icerigini goster
cat -n dosya.txt                # Satir numaralari ile goster
cat -b dosya.txt                # Bos satirlari numaralandirma
cat dosya1.txt dosya2.txt       # Birden fazla dosya birlestir
cat > yeni.txt                  # Stdin'den dosya olustur (Ctrl+D ile bitir)
cat >> mevcut.txt               # Dosyanin sonuna ekle

Alternatifler:

bash
less dosya.txt          # Sayfa sayfa oku (q ile cik, / ile ara)
head -20 dosya.txt      # Ilk 20 satir
tail -20 dosya.txt      # Son 20 satir
tail -f /var/log/syslog # Canli takip (follow)
tail -f log.txt | grep ERROR  # Canli hata takibi

grep -- Metin Arama (Text Search - Detailed)

bash
# Temel kullanim
grep "hata" dosya.txt               # Metin icinde ara
grep -i "error" dosya.txt           # Buyuk/kucuk harf duyarsiz
grep -r "TODO" .                    # Recursive ara (alt dizinler dahil)
grep -rn "function" src/            # Satir numarasi ile recursive

# Cikti kontrolu
grep -c "error" log.txt             # Eslesme sayisini goster
grep -l "password" *.conf           # Sadece dosya adlarini goster
grep -L "test" *.py                 # Eslesmeyenlerin dosya adlarini goster
grep -o "http[^ ]*" dosya.txt       # Sadece eslesen kismi goster

# Context (baglam)
grep -A 3 "error" log.txt           # Eslesmeden sonra 3 satir
grep -B 2 "error" log.txt           # Eslesmeden once 2 satir
grep -C 2 "error" log.txt           # Oncesi ve sonrasi 2 satir

# Regex kullanimi
grep -E "error|warning|critical" log.txt    # Extended regex (OR)
grep -E "^[0-9]+" dosya.txt                 # Rakamla baslayan satirlar
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" dosya.txt  # Email bul
grep -P "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" log.txt  # IP adresi bul (Perl regex)

# Ters eslesme
grep -v "debug" log.txt             # "debug" ICERMEYENLERI goster
grep -v "^#" config.conf            # Yorum satirlarini haric tut
grep -v "^$" dosya.txt              # Bos satirlari haric tut

# Dosya filtreleme
grep -r --include="*.py" "import" . # Sadece .py dosyalarinda ara
grep -r --exclude="*.log" "error" . # .log dosyalarini haric tut
grep -r --exclude-dir=".git" "TODO" .

# Sayma ve istatistik
grep -c "GET\|POST" access.log      # HTTP metod sayisi
grep -rn "FIXME\|TODO\|HACK" src/   # Kod borcu tarama

sed -- Metin Düzenleyici (Stream Editor)

bash
# Metin degistirme
sed 's/eski/yeni/' dosya.txt              # Ilk eslesmyi degistir (her satirda)
sed 's/eski/yeni/g' dosya.txt             # Tum eslesmeleri degistir
sed -i 's/eski/yeni/g' dosya.txt          # Dosyada yerinde degistir
sed -i.bak 's/eski/yeni/g' dosya.txt      # Yedek alarak degistir

# Satir islemleri
sed -n '5p' dosya.txt                     # 5. satiri goster
sed -n '5,10p' dosya.txt                  # 5-10 arasi satirlari goster
sed '3d' dosya.txt                        # 3. satiri sil
sed '/^$/d' dosya.txt                     # Bos satirlari sil
sed '/^#/d' dosya.txt                     # Yorum satirlarini sil

# Ekleme
sed '3i\Yeni satir' dosya.txt             # 3. satirdan once ekle
sed '3a\Yeni satir' dosya.txt             # 3. satirdan sonra ekle
sed '$a\Son satir' dosya.txt              # Dosya sonuna ekle

# Coklu islem
sed -e 's/foo/bar/g' -e 's/baz/qux/g' dosya.txt
sed '/pattern/{ s/old/new/g; s/foo/bar/g; }' dosya.txt

# Pratik ornekler
sed 's/[[:space:]]*$//' dosya.txt         # Satir sonu boslugu sil
sed 's/^/    /' dosya.txt                 # Her satirin basina 4 bosluk ekle
sed -n '/START/,/END/p' dosya.txt         # Iki pattern arasi satirlari goster

awk -- Metin İşleme Dili (Text Processing Language)

bash
# Temel kullanim
awk '{print $1}' dosya.txt                # 1. sutunu goster
awk '{print $1, $3}' dosya.txt            # 1. ve 3. sutunu goster
awk -F: '{print $1}' /etc/passwd          # Ayirici belirle (: ile)
awk -F, '{print $2}' data.csv             # CSV'den 2. sutun

# Kosullu islemler
awk '$3 > 100 {print $0}' dosya.txt       # 3. sutun > 100 olan satirlar
awk '/error/ {print $0}' log.txt          # "error" iceren satirlar
awk 'NR >= 5 && NR <= 10' dosya.txt       # 5-10 arasi satirlar
awk 'NF > 0' dosya.txt                    # Bos olmayan satirlar

# Hesaplama
awk '{sum += $1} END {print sum}' nums.txt          # Toplam
awk '{sum += $1; n++} END {print sum/n}' nums.txt   # Ortalama
awk 'BEGIN {max=0} $1 > max {max=$1} END {print max}' nums.txt  # Maksimum

# Formatlama
awk '{printf "%-20s %10d\n", $1, $2}' dosya.txt     # Formatli cikti
awk 'BEGIN {OFS="\t"} {print $1, $2}' dosya.txt      # Tab ile ayir

# Pratik ornekler
awk '{print NR": "$0}' dosya.txt                     # Satir numarasi ekle
awk '!seen[$0]++' dosya.txt                          # Tekrar eden satirlari sil
awk '{print length, $0}' dosya.txt | sort -n         # Satir uzunluguna gore sirala
awk -F: '$3 >= 1000 {print $1}' /etc/passwd          # Normal kullanicilari listele

sort, uniq, wc, cut (Sorting, Uniqueness, Counting, Cutting)

bash
# sort -- Siralama
sort dosya.txt                  # Alfabetik sirala
sort -n dosya.txt               # Sayisal sirala
sort -r dosya.txt               # Ters sirala
sort -k2 dosya.txt              # 2. sutuna gore sirala
sort -k2 -n dosya.txt           # 2. sutuna gore sayisal sirala
sort -t: -k3 -n /etc/passwd     # : ayirici, 3. alan, sayisal
sort -u dosya.txt               # Benzersiz satirlari sirala

# uniq -- Tekrar Eden Satirlar
sort dosya.txt | uniq            # Tekrarlari kaldir (once sort gerekli)
sort dosya.txt | uniq -c         # Tekrar sayisini goster
sort dosya.txt | uniq -d         # Sadece tekrar edenleri goster
sort dosya.txt | uniq -u         # Sadece tekrar etmeyenleri goster

# wc -- Sayma
wc dosya.txt                     # Satir, kelime, byte sayisi
wc -l dosya.txt                  # Satir sayisi
wc -w dosya.txt                  # Kelime sayisi
wc -c dosya.txt                  # Byte sayisi
wc -m dosya.txt                  # Karakter sayisi
wc -l *.py                       # Her py dosyasinin satir sayisi

# cut -- Sutun Kesme
cut -d: -f1 /etc/passwd          # : ile ayir, 1. alan
cut -d, -f1,3 data.csv           # Virgul ile ayir, 1. ve 3. alan
cut -c1-10 dosya.txt             # Ilk 10 karakter
cut -d' ' -f2- dosya.txt         # 2. alandan itibaren

Pipe ve Redirection (Pipes & I/O Redirection)

Pipe ( | ) (Chaining Commands)

Bir komutun çıktısını başka bir komutun girdisi olarak kullanır.

bash
# Temel pipe kullanimi
ls -la | grep ".log"                    # ls ciktisinda .log ara
cat access.log | sort | uniq -c | sort -rn | head -20
# En cok erisilem 20 satiri goster

ps aux | grep nginx                      # nginx proseslerini bul
history | grep "git"                     # Gecmiste kullanilan git komutlari
dmesg | tail -20                         # Son 20 kernel mesaji

# Coklu pipe
cat /var/log/syslog | grep "error" | awk '{print $1, $2, $3, $NF}' | sort | uniq -c | sort -rn

Redirection

bash
# Standart cikti (stdout)
echo "merhaba" > dosya.txt               # Dosyaya yaz (uzerine yazar)
echo "yeni satir" >> dosya.txt            # Dosyaya ekle (append)

# Standart hata (stderr)
komut 2> hata.log                         # Hatalari dosyaya yaz
komut 2>> hata.log                        # Hatalari dosyaya ekle

# Her ikisi
komut > cikti.log 2>&1                    # stdout ve stderr ayni dosyaya
komut &> cikti.log                        # Kisa yazim (bash)
komut > cikti.log 2> hata.log             # Ayri dosyalara

# Standart girdi (stdin)
komut < girdi.txt                         # Dosyadan girdi al
mysql -u root < script.sql               # SQL dosyasini calistir

# /dev/null -- Ciktiyi yok et
komut > /dev/null 2>&1                    # Tum ciktiyi yok et
komut 2>/dev/null                         # Sadece hatalari yok et

# Here document
cat << 'EOF' > config.txt
server_name=myserver
port=8080
debug=false
EOF

xargs -- Argüman Oluşturucu (Argument Builder)

bash
# Temel kullanim
find . -name "*.tmp" | xargs rm          # Bulunan dosyalari sil
echo "a b c" | xargs -n 1               # Her birini ayri satirda isle

# Bosluklu dosya adlari icin
find . -name "*.log" -print0 | xargs -0 rm

# Paralel calistirma
find . -name "*.jpg" | xargs -P 4 -I {} convert {} -resize 50% small_{}

# Pratik ornekler
cat urls.txt | xargs -n 1 curl -O        # URL listesinden dosya indir
git branch --merged | grep -v main | xargs git branch -d  # Merge edilmis branch'leri sil
find . -name "*.py" | xargs grep "TODO"  # Tum Python dosyalarinda TODO ara

tee -- Çıktıyı Bölümleme (Split Output)

bash
# Hem ekranda goster hem dosyaya yaz
ls -la | tee cikti.txt
komut | tee cikti.txt                     # Ekran + dosya
komut | tee -a cikti.txt                  # Ekran + dosyaya ekle (append)
komut | tee dosya1.txt dosya2.txt         # Birden fazla dosyaya yaz

# Pratik kullanim
make 2>&1 | tee build.log                # Build logunu hem gor hem kaydet

Dosya İzinleri ve Sahiplik (File Permissions & Ownership)

chmod -- İzin Değiştirme (Change Permissions)

İzin yapısı:

-rwxr-xr-x  1  user  group  4096  Jan 1 12:00  dosya.txt
 |||||||||||
 |    |   |
 |    |   +--- Diger (other): r-x (5)
 |    +------- Grup (group):  r-x (5)
 +------------ Sahip (user):  rwx (7)

Sayısal (octal) mod:

SayıİzinAnlam
0---İzin yok
1--xÇalıştırma
2-w-Yazma
3-wxYazma + Çalıştırma
4r--Okuma
5r-xOkuma + Çalıştırma
6rw-Okuma + Yazma
7rwxTam izin
bash
# Sayisal mod
chmod 755 script.sh         # rwxr-xr-x (sahip tam, diger oku+calistir)
chmod 644 dosya.txt         # rw-r--r-- (sahip oku+yaz, diger sadece oku)
chmod 600 gizli.key         # rw------- (sadece sahip)
chmod 777 hersey.sh         # rwxrwxrwx (herkese tam izin - GUVENLI DEGIL)

# Sembolik mod
chmod +x script.sh          # Herkese calistirma izni ekle
chmod u+x script.sh         # Sadece sahibe calistirma izni
chmod g+w dosya.txt         # Gruba yazma izni
chmod o-r dosya.txt         # Digerlerinden okuma iznini kaldir
chmod u=rwx,g=rx,o=r dosya  # Tam tanimlama

# Recursive
chmod -R 755 klasor/        # Dizin ve altindaki her seye uygula
chmod -R u+w klasor/        # Recursive yazma izni ekle

chown -- Sahiplik Değiştirme (Change Ownership)

bash
chown kullanici dosya.txt               # Sahip degistir
chown kullanici:grup dosya.txt          # Sahip ve grup degistir
chown :grup dosya.txt                   # Sadece grup degistir
chown -R kullanici:grup klasor/         # Recursive sahiplik degistir

# Pratik ornekler
sudo chown -R www-data:www-data /var/www/html/
sudo chown -R $USER:$USER ~/projeler/

umask -- Varsayılan İzin Maskesi (Default Permission Mask)

bash
umask              # Mevcut mask'i goster (genellikle 0022)
umask 022          # Varsayilan: dosya 644, dizin 755
umask 077          # Kati: dosya 600, dizin 700
umask 002          # Grup yazabilir: dosya 664, dizin 775

Hesaplama: Dosya için 666 - umask, dizin için 777 - umask.

SUID, SGID ve Sticky Bit (Special Permissions)

bash
# SUID (Set User ID) -- Dosya sahibinin izinleriyle calisir
chmod u+s dosya           # SUID ekle
chmod 4755 dosya          # Sayisal SUID
# Ornek: /usr/bin/passwd SUID ile calisiyor

# SGID (Set Group ID) -- Grubun izinleriyle calisir
chmod g+s klasor/         # SGID ekle
chmod 2755 klasor/        # Sayisal SGID
# Dizinde SGID: yeni dosyalar dizinin grubunu miras alir

# Sticky Bit -- Sadece sahip silebilir
chmod +t klasor/          # Sticky bit ekle
chmod 1777 klasor/        # Sayisal sticky bit
# Ornek: /tmp dizini sticky bit ile korunuyor

# Kontrol
ls -la /usr/bin/passwd    # -rwsr-xr-x (s = SUID)
ls -ld /tmp               # drwxrwxrwt (t = sticky bit)

Proses Yönetimi (Process Management)

ps -- Proses Listeleme (List Processes)

bash
ps                          # Mevcut terminal prosesleri
ps aux                      # Tum prosesler (detayli)
ps -ef                      # Tum prosesler (alternatif format)
ps aux --sort=-%mem          # Bellek kullanimina gore sirala
ps aux --sort=-%cpu          # CPU kullanimina gore sirala
ps -ef --forest              # Proses agaci olarak goster
ps -u kullanici              # Belirli kullanicinin prosesleri
ps -C nginx                  # Belirli programa ait prosesler
ps -p 1234                   # Belirli PID bilgisi

top / htop -- Canlı İzleme (Live Monitoring)

bash
# top
top                          # Canli proses izleme
# top icindeki kisayollar:
# P: CPU'ya gore sirala
# M: Bellek'e gore sirala
# k: Proses oldir (PID gir)
# q: Cik
## 1: Her CPU cekirdegini ayri goster
# c: Tam komut goster

# htop (daha gelismis, kurulum gerekir)
sudo apt install htop
htop
# htop icindeki kisayollar:
# F3 veya /: Ara
# F5: Agac gorunumu
# F6: Siralama degistir
# F9: Proses oldir (sinyal sec)
# F10: Cik

kill -- Proses Sonlandırma (Terminate Process)

bash
# Sinyal turleri
kill PID                     # SIGTERM (15) -- duzgun kapat
kill -9 PID                  # SIGKILL (9) -- zorla oldir
kill -STOP PID               # Duraklat
kill -CONT PID               # Devam ettir
kill -HUP PID                # Yapilandirmayi yeniden yukle

# Birden fazla proses
kill PID1 PID2 PID3
killall nginx                # Isme gore hepsini oldir
killall -9 nginx             # Zorla oldir
pkill -f "python script.py"  # Pattern ile oldir

# Pratik
kill -0 PID                  # Proses var mi kontrol et (sinyal gondermez)
kill -l                      # Tum sinyalleri listele

nohup -- Arka Plan Çalıştırma (Background Execution)

bash
# Terminal kapansa bile calismaya devam et
nohup uzun_islem.sh &
nohup python scraper.py > cikti.log 2>&1 &

# Alternatif: disown
./script.sh &
disown %1                    # Isi terminalle iliskisini kes

screen -- Terminal Multiplexer (Terminal Sessions)

bash
# Kurulum
sudo apt install screen

# Temel kullanim
screen                       # Yeni session baslat
screen -S isim               # Isimli session baslat
screen -ls                   # Session'lari listele
screen -r isim               # Session'a baglan
screen -d -r isim            # Detach edip baglan

# screen icindeki kisayollar (Ctrl+A oneki):
# Ctrl+A c     : Yeni pencere
# Ctrl+A n     : Sonraki pencere
# Ctrl+A p     : Onceki pencere
# Ctrl+A d     : Detach (session arkaplanda kalir)
# Ctrl+A k     : Pencereyi kapat
# Ctrl+A "     : Pencere listesi
# Ctrl+A A     : Pencere yeniden adlandir
# Ctrl+A [     : Scroll modu (q ile cik)

tmux -- Terminal Multiplexer (Advanced Terminal Sessions)

bash
# Kurulum
sudo apt install tmux

# Session yonetimi
tmux                            # Yeni session baslat
tmux new -s proje               # Isimli session
tmux ls                         # Session listele
tmux attach -t proje            # Session'a baglan
tmux kill-session -t proje      # Session'i sil
tmux kill-server                # Tum session'lari sil

tmux kısayolları (Ctrl+B öneki):

Kısayolİşlem
Ctrl+B cYeni pencere
Ctrl+B nSonraki pencere
Ctrl+B pOnceki pencere
Ctrl+B 0-9Pencere numarasina git
Ctrl+B ,Pencere yeniden adlandir
Ctrl+B &Pencereyi kapat
Ctrl+B %Dikey bol
Ctrl+B "Yatay bol
Ctrl+B oPaneller arasi gec
Ctrl+B xPaneli kapat
Ctrl+B zPaneli buyut/kucult
Ctrl+B dDetach
Ctrl+B [Scroll modu
Ctrl+B :Komut modu

tmux yapılandırması (~/.tmux.conf):

bash
# Mouse destegi
set -g mouse on

# Prefix degistir (Ctrl+A yap)
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# Panelleri vim tuslariyla yonet
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Daha mantikli bol kisayollari
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"

# Yeni pencere mevcut dizinde acilsin
bind c new-window -c "#{pane_current_path}"

# Status bar
set -g status-bg colour235
set -g status-fg white
set -g status-right '%H:%M %d-%b-%Y'

## 256 renk destegi
set -g default-terminal "screen-256color"

# History limiti
set -g history-limit 50000

Network Araçları (Network Tools)

curl -- HTTP İstemci (HTTP Client - Detailed)

bash
# GET istegi
curl https://api.example.com/users
curl -s https://api.example.com/users           # Silent mod
curl -v https://api.example.com/users           # Verbose (detayli)
curl -o dosya.json https://api.example.com/data # Dosyaya kaydet
curl -O https://example.com/dosya.zip           # Orijinal isimle kaydet

# POST istegi
curl -X POST https://api.example.com/users \
  -H "Content-Type: application/json" \
  -d '{"name": "Ali", "email": "ali@example.com"}'

# Form verisi
curl -X POST https://example.com/upload \
  -F "file=@dosya.pdf" \
  -F "name=belge"

# Header islemleri
curl -H "Authorization: Bearer TOKEN" https://api.example.com/me
curl -I https://example.com                     # Sadece header'lari goster
curl -H "Accept: application/json" https://api.example.com/data

# Diger HTTP metodlari
curl -X PUT https://api.example.com/users/1 \
  -H "Content-Type: application/json" \
  -d '{"name": "Veli"}'

curl -X DELETE https://api.example.com/users/1
curl -X PATCH https://api.example.com/users/1 \
  -d '{"name": "Ahmet"}'

# Redirect takip
curl -L https://short.url/abc                    # Redirect'leri takip et

# Kimlik dogrulama
curl -u kullanici:sifre https://api.example.com/private
curl --cookie "session=abc123" https://example.com

# Zaman asimi
curl --connect-timeout 5 --max-time 30 https://api.example.com

# Indirme ilerleme
curl -# -O https://example.com/buyuk_dosya.zip   # Ilerleme cubugu

# Pratik ornekler
curl -s https://api.example.com/users | python3 -m json.tool  # JSON formatla
curl -w "\n%{http_code}\n" https://example.com   # HTTP durum kodu
curl -s -o /dev/null -w "%{time_total}" https://example.com  # Yanit suresi

wget -- Dosya İndirme (File Download)

bash
wget https://example.com/dosya.zip              # Dosya indir
wget -O isim.zip https://example.com/dosya.zip  # Farkli isimle kaydet
wget -c https://example.com/buyuk.iso           # Kesilen indirmeye devam et
wget -q https://example.com/dosya.zip           # Sessiz mod
wget -r -l 2 https://example.com               # Recursive indir (2 seviye)
wget -i urls.txt                                # Dosyadaki URL'leri indir
wget --limit-rate=1m https://example.com/dosya  # Hiz siniri
wget -b https://example.com/buyuk.iso           # Arka planda indir

ss -- Soket İstatistikleri (Socket Statistics)

bash
ss -tuln                    # TCP/UDP dinleyen portlar
ss -tlnp                    # Dinleyen TCP portlari + proses bilgisi
ss -s                       # Soket istatistik ozeti
ss -t state established     # Aktif baglantilari goster
ss -tnp | grep :80          # 80 portundaki baglantilari goster
ss -o state time-wait       # TIME_WAIT durumundaki soketler

ping, dig (Network Diagnostics)

bash
# ping -- Baglanti testi
ping example.com                    # Surekli ping
ping -c 4 example.com               # 4 paket gonder
ping -i 0.5 example.com             # 0.5 saniye aralikla
ping -W 2 example.com               # 2 saniye zaman asimi

# dig -- DNS sorgu
dig example.com                      # A kaydi sorgula
dig example.com MX                   # MX kayitlari
dig example.com NS                   # NS kayitlari
dig +short example.com               # Kisa cikti
dig @8.8.8.8 example.com            # Belirli DNS sunucusu kullan
dig -x 1.2.3.4                      # Reverse DNS
dig +trace example.com              # DNS cozumleme adimlarini goster

nmap -- Port Tarama (Port Scanning - Brief)

bash
nmap 192.168.1.1                    # Temel port tarama
nmap -sV 192.168.1.1                # Servis versiyon tespiti
nmap -p 80,443,8080 192.168.1.1     # Belirli portlari tara
nmap -p- 192.168.1.1                # Tum portlari tara (65535)
nmap -sn 192.168.1.0/24             # Ag tarama (port tarama yok)
nmap -A 192.168.1.1                 # Agresif tarama (OS, versiyon, script)

Not: nmap sadece yetkilendirilmiş sistemlerde kullanılmalıdır.


Disk ve Arşiv Yönetimi (Disk & Archive Management)

df -- Disk Alanı (Disk Space)

bash
df                      # Tum disk bolumleri
df -h                   # Okunabilir format (GB, MB)
df -h /                 # Belirli bolum
df -hT                  # Dosya sistemi tipi ile
df -i                   # Inode kullanimi

du -- Dizin Boyutu (Directory Size)

bash
du -sh klasor/                      # Dizin toplam boyutu
du -sh *                            # Her ogenin boyutu
du -sh * | sort -hr                 # Boyuta gore sirala
du -sh * | sort -hr | head -10      # En buyuk 10 oge
du -h --max-depth=1                 # 1 seviye derinlik
du -ah . | sort -hr | head -20     # En buyuk 20 dosya/dizin

# Pratik: Belirli turde dosyalarin toplam boyutu
find . -name "*.log" -exec du -ch {} + | tail -1

tar -- Arşivleme (Archiving)

bash
# Arsiv olusturma
tar -cf arsiv.tar klasor/                   # tar arsivi olustur
tar -czf arsiv.tar.gz klasor/               # gzip ile sikistra
tar -cjf arsiv.tar.bz2 klasor/              # bzip2 ile sikistra
tar -cJf arsiv.tar.xz klasor/               # xz ile sikistra

# Arsiv acma
tar -xf arsiv.tar                            # tar arsivi ac
tar -xzf arsiv.tar.gz                        # gzip arsivi ac
tar -xjf arsiv.tar.bz2                       # bzip2 arsivi ac
tar -xJf arsiv.tar.xz                        # xz arsivi ac
tar -xf arsiv.tar.gz -C hedef_klasor/       # Belirli dizine ac

# Arsiv icerigi listeleme
tar -tf arsiv.tar.gz                         # Icerigi listele
tar -tzf arsiv.tar.gz | head -20             # Ilk 20 girdi

# Secici arsivleme
tar -czf arsiv.tar.gz --exclude="*.log" --exclude="node_modules" klasor/
tar -czf arsiv.tar.gz --exclude-vcs klasor/  # .git haric tut

# Gunluk yedek ornegi
tar -czf "yedek_$(date +%Y%m%d_%H%M%S).tar.gz" /var/www/html/

gzip, zip (Compression)

bash
# gzip
gzip dosya.txt              # Sikistra (dosya.txt.gz olur, orijinal silinir)
gzip -k dosya.txt           # Orijinali koru
gzip -d dosya.txt.gz        # Ac (gunzip ile ayni)
gunzip dosya.txt.gz          # Ac
gzip -l dosya.txt.gz        # Arsiv bilgisi
gzip -9 dosya.txt           # Maksimum sikistirma
gzip -1 dosya.txt           # Hizli sikistirma (dusuk oran)

# zip
zip arsiv.zip dosya1 dosya2          # Zip arsivi olustur
zip -r arsiv.zip klasor/              # Dizin dahil
zip -e arsiv.zip dosya.txt            # Sifreli zip
zip -u arsiv.zip yeni_dosya.txt       # Arsive dosya ekle
unzip arsiv.zip                        # Zip arsivi ac
unzip arsiv.zip -d hedef/             # Belirli dizine ac
unzip -l arsiv.zip                     # Icerigi listele

SSH -- Güvenli Uzak Bağlantı (Secure Remote Connection - Detailed)

SSH Key Oluşturma (Generate SSH Keys)

bash
# ED25519 (onerilen)
ssh-keygen -t ed25519 -C "email@example.com"

# RSA (eski sistemler icin)
ssh-keygen -t rsa -b 4096 -C "email@example.com"

# Varsayilan konum: ~/.ssh/id_ed25519 (veya id_rsa)
# Passphrase kullanilmasi tavsiye edilir

# Public key'i sunucuya kopyala
ssh-copy-id kullanici@sunucu
ssh-copy-id -i ~/.ssh/ozel_key.pub kullanici@sunucu

# Manuel kopyalama
cat ~/.ssh/id_ed25519.pub | ssh kullanici@sunucu "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# Key izinleri
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/config

SSH Config Dosyası (SSH Configuration File)

bash
# Genel ayarlar
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes
    IdentitiesOnly yes

# Uretim sunucusu
Host production
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/production_key

# Gelistirme sunucusu
Host dev
    HostName 192.168.1.100
    User developer
    IdentityFile ~/.ssh/dev_key
    ForwardAgent yes

# Bastion/Jump host uzerinden baglanma
Host internal-server
    HostName 10.0.0.5
    User admin
    ProxyJump bastion

Host bastion
    HostName 203.0.113.20
    User jump-user
    IdentityFile ~/.ssh/bastion_key

# Wildcard
Host *.example.com
    User deploy
    IdentityFile ~/.ssh/example_key

Kullanim:

bash
ssh production          # ssh deploy@203.0.113.10 -p 2222 yerine
ssh dev                 # Kisaltilmis baglanti

scp -- Güvenli Kopyalama (Secure Copy)

bash
# Yerel -> Uzak
scp dosya.txt kullanici@sunucu:/hedef/yol/
scp -r klasor/ kullanici@sunucu:/hedef/yol/
scp -P 2222 dosya.txt kullanici@sunucu:/tmp/

# Uzak -> Yerel
scp kullanici@sunucu:/var/log/app.log ./
scp -r kullanici@sunucu:/var/www/html/ ./yedek/

# Sunucu -> Sunucu
scp kullanici1@sunucu1:/dosya kullanici2@sunucu2:/hedef/

rsync -- Gelişmiş Senkronizasyon (Advanced Sync)

bash
# Temel kullanim
rsync -avz kaynak/ hedef/                           # Yerel senkronizasyon
rsync -avz kaynak/ kullanici@sunucu:/hedef/          # Uzak senkronizasyon
rsync -avz kullanici@sunucu:/kaynak/ ./yerel/        # Uzaktan yerele

# Onemli flag'ler
rsync -avz --progress kaynak/ hedef/                 # Ilerleme goster
rsync -avz --delete kaynak/ hedef/                   # Hedefteki fazlaliklari sil
rsync -avz --exclude="*.log" kaynak/ hedef/          # Haric tut
rsync -avz --exclude-from="exclude.txt" kaynak/ hedef/
rsync -avz --dry-run kaynak/ hedef/                  # Simlasyon (ne yapilacagini goster)

# Yedekleme ornegi
rsync -avz --delete \
  --exclude=".git" \
  --exclude="node_modules" \
  --exclude="*.log" \
  /var/www/html/ /yedek/www/

# Bandwidth sinirli
rsync -avz --bwlimit=1000 kaynak/ hedef/             # 1000 KB/s limit

# SSH port belirterek
rsync -avz -e "ssh -p 2222" kaynak/ kullanici@sunucu:/hedef/

rsync flag açıklamaları:

FlagAnlam
-aArchive mod (recursive + izinleri koru)
-vVerbose (detaylı çıktı)
-zTransfer sırasında sıkıştır
-P--progress + --partial (ilerleme + kesilen transferi devam ettir)
--deleteKaynakta olmayanları hedeften sil
--dry-runDeğişiklikleri göster ama uygulama

SSH Tunnel (Port Forwarding)

Local Port Forwarding (Yerel Port Yönlendirme)

Uzak sunucudaki bir servise yerel port üzerinden eriş.

bash
# Syntax: ssh -L yerel_port:hedef_host:hedef_port kullanici@sunucu

# Uzak sunucudaki PostgreSQL'e yerel 5432'den eris
ssh -L 5432:localhost:5432 kullanici@sunucu

# Uzak agin icindeki bir servise eris
ssh -L 3306:veritabani-sunucu:3306 kullanici@bastion

# Web uygulamasi
ssh -L 8080:localhost:80 kullanici@sunucu
# Tarayicida http://localhost:8080 ile erisim

# Arka planda calistir
ssh -fNL 5432:localhost:5432 kullanici@sunucu

Remote Port Forwarding (Uzak Port Yönlendirme)

Yerel makinenizdeki bir servisi uzak sunucu üzerinden erişime aç.

bash
# Syntax: ssh -R uzak_port:yerel_host:yerel_port kullanici@sunucu

# Yerel 3000 portunu sunucu uzerinden erisime ac
ssh -R 8080:localhost:3000 kullanici@sunucu
# Sunucuda http://localhost:8080 ile yerel uygulamaya eris

# Arka planda
ssh -fNR 8080:localhost:3000 kullanici@sunucu

Dynamic Port Forwarding (SOCKS Proxy)

bash
# SOCKS proxy olustur
ssh -D 1080 kullanici@sunucu

# Arka planda
ssh -fND 1080 kullanici@sunucu

# Tarayici veya uygulama SOCKS proxy olarak localhost:1080 kullanir
# curl ile kullanim
curl --socks5 localhost:1080 https://example.com

SSH Güvenlik (SSH Security)

bash
# /etc/ssh/sshd_config ayarlari
Port 2222                           # Varsayilan portu degistir
PermitRootLogin no                  # Root girisini kapat
PasswordAuthentication no           # Sifre ile girisi kapat
PubkeyAuthentication yes            # Key ile giris
MaxAuthTries 3                      # Maksimum deneme
AllowUsers deploy admin             # Sadece belirli kullanicilar
LoginGraceTime 30                   # Giris zaman asimi (saniye)
ClientAliveInterval 300             # 5 dakika inaktivite kontrolu
ClientAliveCountMax 2               # 2 basarisiz kontrolde kes

# Degisiklikleri uygula
sudo systemctl restart sshd

# Fail2ban kurulumu (brute-force koruma)
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

/etc/fail2ban/jail.local önemli ayarlar:

ini
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600

Bash Scripting (Kabuk Betikleri)

Değişkenler (Variables)

bash
#!/bin/bash

# Degisken tanimlama (= etrafinda bosluk OLMAMALI)
isim="Ali"
sayi=42
dizi=("elma" "armut" "kiraz")

# Degisken kullanma
echo "Merhaba $isim"
echo "Sayi: ${sayi}"
echo "Ilk eleman: ${dizi[0]}"
echo "Tum elemanlar: ${dizi[@]}"
echo "Eleman sayisi: ${#dizi[@]}"

# Komut ciktisini degiskene atama
tarih=$(date +%Y-%m-%d)
dosya_sayisi=$(ls | wc -l)

# Ortam degiskenleri
export API_KEY="abc123"
echo $HOME
echo $USER
echo $PATH
echo $PWD

# Varsayilan deger
echo ${isim:-"Bilinmiyor"}          # isim bossa "Bilinmiyor" kullan
echo ${port:=8080}                  # port bossa 8080 ata

# String islemleri
metin="Merhaba Dunya"
echo ${#metin}                      # Uzunluk
echo ${metin:0:7}                   # Alt string (Merhaba)
echo ${metin/Dunya/Linux}           # Degistirme
echo ${dosya%.txt}                  # .txt uzantisini kaldir
echo ${dosya##*/}                   # Yol bilgisini kaldir (basename)

Koşullar (Conditions - if / case)

bash
#!/bin/bash

# if-elif-else
if [ "$1" = "start" ]; then
    echo "Baslatiliyor..."
elif [ "$1" = "stop" ]; then
    echo "Durduruluyor..."
else
    echo "Kullanim: $0 {start|stop}"
    exit 1
fi

# Sayi karsilastirma
if [ "$sayi" -gt 10 ]; then
    echo "10'dan buyuk"
elif [ "$sayi" -eq 10 ]; then
    echo "10'a esit"
else
    echo "10'dan kucuk"
fi

# Dosya kontrolleri
if [ -f "/etc/nginx/nginx.conf" ]; then
    echo "Nginx yapilandirmasi mevcut"
fi

if [ -d "/var/www/html" ]; then
    echo "Web dizini mevcut"
fi

if [ -r "dosya.txt" ]; then
    echo "Dosya okunabilir"
fi

# String kontrolleri
if [ -z "$degisken" ]; then
    echo "Degisken bos"
fi

if [ -n "$degisken" ]; then
    echo "Degisken dolu"
fi

# [[ ]] ile gelismis kosullar (bash ozel)
if [[ "$isim" == Ali* ]]; then
    echo "Ali ile basliyor"
fi

if [[ "$dosya" =~ \.log$ ]]; then
    echo "Log dosyasi"
fi

# Mantiksal operatorler
if [[ -f "config.yml" && -r "config.yml" ]]; then
    echo "Config dosyasi mevcut ve okunabilir"
fi

if [[ "$port" -lt 1 || "$port" -gt 65535 ]]; then
    echo "Gecersiz port"
fi

Karşılaştırma operatörleri:

OperatorAnlam
-eqEşit (equal)
-neEşit değil (not equal)
-gtBüyük (greater than)
-geBüyük eşit (greater or equal)
-ltKüçük (less than)
-leKüçük eşit (less or equal)

Dosya test operatörleri:

OperatorAnlam
-fDosya var mı
-dDizin var mı
-eVar mı (dosya veya dizin)
-rOkunabilir mi
-wYazılabilir mi
-xÇalıştırılabilir mi
-sBoyutu 0'dan büyük mü
-LSembolik link mi

case yapısı:

bash
#!/bin/bash

case "$1" in
    start)
        echo "Baslatiliyor..."
        ;;
    stop)
        echo "Durduruluyor..."
        ;;
    restart)
        echo "Yeniden baslatiliyor..."
        ;;
    status)
        echo "Durum kontrol ediliyor..."
        ;;
    *)
        echo "Kullanim: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

Döngüler (Loops - for / while)

bash
#!/bin/bash

# for dongusu -- liste
for meyve in elma armut kiraz; do
    echo "Meyve: $meyve"
done

# for dongusu -- sayi araligi
for i in {1..10}; do
    echo "Sayi: $i"
done

# for dongusu -- C stili
for ((i=0; i<10; i++)); do
    echo "Index: $i"
done

# for dongusu -- dosya listesi
for dosya in /var/log/*.log; do
    echo "Log dosyasi: $dosya"
    wc -l "$dosya"
done

# for dongusu -- komut ciktisi
for user in $(cut -d: -f1 /etc/passwd); do
    echo "Kullanici: $user"
done

# while dongusu
sayac=1
while [ $sayac -le 5 ]; do
    echo "Sayac: $sayac"
    ((sayac++))
done

# while -- dosya satir satir oku
while IFS= read -r satir; do
    echo "Satir: $satir"
done < dosya.txt

# while -- sonsuz dongu
while true; do
    echo "Calisiyor... (Ctrl+C ile dur)"
    sleep 5
done

# until dongusu
until [ -f "/tmp/hazir.flag" ]; do
    echo "Bekleniyor..."
    sleep 2
done
echo "Hazir!"

# break ve continue
for i in {1..10}; do
    if [ $i -eq 3 ]; then
        continue        # 3'u atla
    fi
    if [ $i -eq 8 ]; then
        break           # 8'de dur
    fi
    echo $i
done

Fonksiyonlar (Functions)

bash
#!/bin/bash

# Fonksiyon tanimlama
log_mesaj() {
    local seviye="$1"
    local mesaj="$2"
    local tarih=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$tarih] [$seviye] $mesaj"
}

# Fonksiyon cagrisi
log_mesaj "INFO" "Uygulama baslatildi"
log_mesaj "ERROR" "Baglanti hatasi"

# Donus degeri
dosya_kontrol() {
    if [ -f "$1" ]; then
        return 0    # basarili
    else
        return 1    # basarisiz
    fi
}

if dosya_kontrol "/etc/nginx/nginx.conf"; then
    echo "Nginx mevcut"
fi

# Cikti dondurme
toplam_boyut() {
    du -sh "$1" 2>/dev/null | cut -f1
}

boyut=$(toplam_boyut "/var/log")
echo "Log dizini boyutu: $boyut"

# Varsayilan parametreli fonksiyon
yedekle() {
    local kaynak="${1:?Kaynak belirtilmeli}"
    local hedef="${2:-/tmp/yedek}"
    local tarih=$(date +%Y%m%d)

    mkdir -p "$hedef"
    tar -czf "${hedef}/yedek_${tarih}.tar.gz" "$kaynak"
    echo "Yedekleme tamamlandi: ${hedef}/yedek_${tarih}.tar.gz"
}

Error Handling -- Hata Yönetimi (set -euo pipefail)

bash
#!/bin/bash
set -euo pipefail

# set -e   : Herhangi bir komut hata verirse script durur
# set -u   : Tanimlanmamis degisken kullanilirsa hata verir
# set -o pipefail : Pipe icindeki herhangi bir komut hata verirse hata dondurur

# Hata yakalama (trap)
cleanup() {
    echo "Temizlik yapiliyor..."
    rm -f /tmp/gecici_dosya
}
trap cleanup EXIT          # Script bittiginde calistir
trap cleanup ERR           # Hata olustugunda calistir

# Hata mesaji ile cikis
hata_cik() {
    echo "HATA: $1" >&2
    exit "${2:-1}"
}

# Kullanim
[ -f "config.yml" ] || hata_cik "config.yml bulunamadi" 2

# Try-catch benzeri yapi
if ! komut_calistir; then
    echo "Komut basarisiz, alternatif deneniyor..."
    alternatif_komut
fi

# Veya || ile
komut || { echo "Basarisiz oldu"; exit 1; }

Pratik Script Örnekleri (Practical Script Examples)

Otomatik Yedekleme Script'i (Automatic Backup Script)

bash
#!/bin/bash
set -euo pipefail

# Yapilandirma
KAYNAK="/var/www/html"
HEDEF="/yedek"
SAKLA_GUN=30
LOG="/var/log/yedekleme.log"
TARIH=$(date +%Y%m%d_%H%M%S)

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}

log "Yedekleme baslatildi"

# Hedef dizini olustur
mkdir -p "$HEDEF"

# Yedek al
YEDEK_DOSYA="${HEDEF}/yedek_${TARIH}.tar.gz"
if tar -czf "$YEDEK_DOSYA" "$KAYNAK" 2>> "$LOG"; then
    BOYUT=$(du -sh "$YEDEK_DOSYA" | cut -f1)
    log "Yedek basarili: $YEDEK_DOSYA ($BOYUT)"
else
    log "HATA: Yedekleme basarisiz!"
    exit 1
fi

# Eski yedekleri temizle
find "$HEDEF" -name "yedek_*.tar.gz" -mtime +${SAKLA_GUN} -delete
log "30 gunden eski yedekler temizlendi"

log "Yedekleme tamamlandi"

Sistem Sağlığı Kontrol Script'i (System Health Check Script)

bash
#!/bin/bash

echo "=== Sistem Sagligi Raporu ==="
echo "Tarih: $(date)"
echo ""

# CPU kullanimi
echo "--- CPU Kullanimi ---"
top -bn1 | head -5
echo ""

# Bellek kullanimi
echo "--- Bellek Kullanimi ---"
free -h
echo ""

# Disk kullanimi
echo "--- Disk Kullanimi ---"
df -h | grep -vE "tmpfs|udev"
echo ""

# Yuksek disk kullanimini kontrol et
DISK_KULLANIMI=$(df -h / | awk 'NR==2 {gsub(/%/,""); print $5}')
if [ "$DISK_KULLANIMI" -gt 80 ]; then
    echo "UYARI: Disk kullanimi %${DISK_KULLANIMI} - kritik seviye!"
fi

# En cok CPU kullanan 5 proses
echo "--- En Cok CPU Kullanan Prosesler ---"
ps aux --sort=-%cpu | head -6
echo ""

# En cok RAM kullanan 5 proses
echo "--- En Cok RAM Kullanan Prosesler ---"
ps aux --sort=-%mem | head -6
echo ""

# Uptime
echo "--- Uptime ---"
uptime
echo ""

# Aktif baglanti sayisi
echo "--- Aktif Baglanti Sayisi ---"
ss -s

Log Analiz Script'i (Log Analysis Script)

bash
#!/bin/bash
set -euo pipefail

LOG_DOSYA="${1:?Kullanim: $0 <log_dosyasi>}"

[ -f "$LOG_DOSYA" ] || { echo "Dosya bulunamadi: $LOG_DOSYA"; exit 1; }

echo "=== Log Analizi: $LOG_DOSYA ==="
echo ""

echo "Toplam satir sayisi: $(wc -l < "$LOG_DOSYA")"
echo ""

echo "--- HTTP Durum Kodlari ---"
awk '{print $9}' "$LOG_DOSYA" | sort | uniq -c | sort -rn | head -10
echo ""

echo "--- En Cok Istek Yapan IP'ler ---"
awk '{print $1}' "$LOG_DOSYA" | sort | uniq -c | sort -rn | head -10
echo ""

echo "--- En Cok Istenen Sayfalar ---"
awk '{print $7}' "$LOG_DOSYA" | sort | uniq -c | sort -rn | head -10
echo ""

echo "--- Saatlik Istek Dagilimi ---"
awk -F'[' '{print $2}' "$LOG_DOSYA" | awk -F: '{print $2":00"}' | sort | uniq -c
echo ""

echo "--- 404 Hatalari ---"
awk '$9 == 404 {print $7}' "$LOG_DOSYA" | sort | uniq -c | sort -rn | head -10
echo ""

echo "--- 500 Hatalari ---"
awk '$9 == 500 {print $7}' "$LOG_DOSYA" | sort | uniq -c | sort -rn | head -10

Cron -- Zamanlanmış Görevler (Scheduled Tasks - Detailed)

Cron Expression Formatı (Cron Expression Format)

*     *     *     *     *     komut
|     |     |     |     |
|     |     |     |     +---- Haftanin gunu (0-7, 0 ve 7 = Pazar)
|     |     |     +---------- Ay (1-12)
|     |     +---------------- Ayin gunu (1-31)
|     +---------------------- Saat (0-23)
+---------------------------- Dakika (0-59)

Cron Yönetimi (Cron Management)

bash
crontab -e              # Cron gorevlerini duzenle
crontab -l              # Mevcut gorevleri listele
crontab -r              # Tum gorevleri sil
crontab -u kullanici -l # Baska kullanicinin gorevleri

Cron Örnekleri Tablosu (Cron Examples Table)

ExpressionAçıklama
* * * * *Her dakika
*/5 * * * *Her 5 dakikada
*/15 * * * *Her 15 dakikada
0 * * * *Her saat basinda
0 */2 * * *Her 2 saatte
0 0 * * *Her gun gece yarisi
0 6 * * *Her gun sabah 6'da
0 0 * * 0Her pazar gece yarisi
0 0 * * 1-5Hafta ici her gun gece yarisi
0 0 1 * *Her ayin 1'inde gece yarisi
0 0 1 1 *Her yilin 1 Ocak'inda
30 4 * * *Her gun 04:30'da
0 9-17 * * 1-5Hafta ici 09:00-17:00 arasi her saat
0 0 */3 * *Her 3 gunde bir
0,30 * * * *Her saat basi ve yarimda

Cron Pratik Örnekler (Practical Cron Examples)

bash
# Crontab icerigi ornegi
# Her gun gece 2'de yedek al
0 2 * * * /home/user/scripts/yedekle.sh >> /var/log/yedek.log 2>&1

# Her 5 dakikada sistem kontrol
*/5 * * * * /home/user/scripts/kontrol.sh

# Her pazartesi sabah 9'da rapor gonder
0 9 * * 1 /home/user/scripts/rapor.sh | mail -s "Haftalik Rapor" admin@example.com

# Her saat basinda log dosyalarini temizle
0 * * * * find /var/log/app -name "*.log" -mtime +7 -delete

# Her ayin 1'inde disk raporu
0 0 1 * * df -h | mail -s "Disk Raporu" admin@example.com

# Cron loglari
grep CRON /var/log/syslog           # Cron loglarini incele
journalctl -u cron                  # systemd ile cron loglari

Cron Özel Kısayollar (Special Cron Shortcuts)

KısayolAnlam
@rebootSistem başlatıldığında
@yearlyYılda bir (0 0 1 1 *)
@monthlyAyda bir (0 0 1 * *)
@weeklyHaftada bir (0 0 * * 0)
@dailyGünde bir (0 0 * * *)
@hourlySaatte bir (0 * * * *)
bash
@reboot /home/user/scripts/baslangic.sh
@daily /home/user/scripts/gunluk_yedek.sh

One-Liner Koleksiyonu (One-Liner Collection)

Dosya İşlemleri (File Operations)

bash
# En buyuk 10 dosyayi bul
find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10

## 30 gunden eski log dosyalarini sil
find /var/log -name "*.log" -mtime +30 -delete

# Bos dizinleri bul ve sil
find . -type d -empty -delete

# Dosya uzantisini toplu degistir
for f in *.txt; do mv "$f" "${f%.txt}.md"; done

# Belirli boyuttaki dosyalari bul
find . -type f -size +100M -exec ls -lh {} \;

# Dosya icindeki satir sayisina gore siralama
find . -name "*.py" -exec wc -l {} + | sort -n

# Dizin icerigini karsilastir
diff <(ls dir1) <(ls dir2)

# Checksum kontrolu
find . -type f -exec md5sum {} + > checksums.txt
md5sum -c checksums.txt

Metin İşlemleri (Text Operations)

bash
# Dosyadaki benzersiz kelimeleri say
tr ' ' '\n' < dosya.txt | sort | uniq -c | sort -rn | head -20

# IP adreslerini cikar
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log | sort | uniq -c | sort -rn

# CSV'den belirli sutun
awk -F',' '{print $2}' data.csv

# JSON'dan deger cikar (jq)
curl -s https://api.example.com/data | jq '.users[].name'

# Iki dosya arasindaki farklari goster
diff <(sort dosya1.txt) <(sort dosya2.txt)

# Tab'i bosluga cevir
expand -t 4 dosya.txt > yeni_dosya.txt

# Buyuk harfe cevir
tr '[:lower:]' '[:upper:]' < dosya.txt

# Bos satirlari sil
sed '/^$/d' dosya.txt

# Satir sonundaki bosluklari temizle
sed 's/[[:space:]]*$//' dosya.txt

# Dosyadaki tekrar eden satirlari goster
sort dosya.txt | uniq -d

Network İşlemleri (Network Operations)

bash
# Acik portlari kontrol et
ss -tuln | grep LISTEN

# Belirli portun kullanilip kullanilmadigini kontrol et
ss -tlnp | grep :8080

# Dis IP adresini ogren
curl -s ifconfig.me

# DNS kayitlarini sorgula
dig +short example.com A

# HTTP yanit suresini olc
curl -w "%{time_total}s\n" -o /dev/null -s https://example.com

# Belirli bir IP'ye traceroute
traceroute -n 8.8.8.8

# Baglanti sayisini IP bazinda goster
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

# Port tarama (nmap olmadan)
for port in 22 80 443 3306 5432 6379 8080; do
    (echo > /dev/tcp/sunucu/$port) 2>/dev/null && echo "Port $port acik"
done

Process İşlemleri (Process Operations)

bash
# En cok bellek kullanan 10 proses
ps aux --sort=-%mem | head -11

# Belirli isimde proses var mi
pgrep -x nginx && echo "Calisiyor" || echo "Calismiyor"

# Zombie prosesleri bul
ps aux | awk '$8 ~ /Z/ {print}'

# Proses agaci
pstree -p

# Proses baslangic suresini goster
ps -eo pid,lstart,cmd | grep nginx

# Belirli kullanicinin proses sayisi
ps -u www-data --no-headers | wc -l

# Bellek kullanimini MB olarak goster
ps aux --sort=-%mem | awk 'NR<=11 {printf "%-8s %-6s %-6s %s\n", $1, $4"%", $11, $NF}'

Git İşlemleri (Git Operations)

bash
# Son commit'i geri al (soft)
git reset --soft HEAD~1

# Merge edilmis branch'leri sil
git branch --merged | grep -v "main\|master" | xargs git branch -d

# Tum dosyalardaki degisiklik sayisi
git diff --stat

# En cok commit yapan yazarlar
git shortlog -sn --no-merges

# Belirli dosyanin tarihcesi
git log --oneline --follow -- dosya.txt

# Son 7 gundeki commit'ler
git log --since="7 days ago" --oneline

# Buyuk dosyalari repo tarihcesinde bul
git rev-list --objects --all | git cat-file --batch-check='%(objectsize) %(rest)' | sort -rn | head -10

Docker İşlemleri (Docker Operations)

bash
# Durmus container'lari temizle
docker container prune -f

# Kullanilmayan imajlari temizle
docker image prune -a -f

# Tum Docker kaynaklarini temizle
docker system prune -af --volumes

# Container loglarini takip et
docker logs -f --tail 100 container_adi

# Container icinde shell ac
docker exec -it container_adi /bin/bash

# Container kaynak kullanimini izle
docker stats --no-stream

# Docker disk kullanimini goster
docker system df

# Tum container'lari durdur
docker stop $(docker ps -q)

İpuçları ve Verimlilik (Tips & Productivity)

Alias Tanımlamaları (Command Aliases)

~/.bashrc veya ~/.zshrc dosyasina ekleyin:

bash
# Navigasyon
alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."

# ls alternatifleri
alias ll="ls -lah"
alias la="ls -la"
alias lt="ls -ltr"

# Guvenlik
alias rm="rm -i"
alias cp="cp -i"
alias mv="mv -i"

# Git kisayollari
alias gs="git status"
alias ga="git add"
alias gc="git commit"
alias gp="git push"
alias gl="git log --oneline -20"
alias gd="git diff"
alias gb="git branch"

# Docker kisayollari
alias dps="docker ps"
alias dpsa="docker ps -a"
alias dimg="docker images"
alias dlogs="docker logs -f"
alias dexec="docker exec -it"

# Sistem
alias ports="ss -tuln"
alias meminfo="free -h"
alias diskinfo="df -h"
alias myip="curl -s ifconfig.me"

# Arama
alias grep="grep --color=auto"
alias fhere="find . -name"

# Pratik
alias reload="source ~/.bashrc"
alias timestamp="date +%Y%m%d_%H%M%S"
alias path='echo -e ${PATH//:/\\n}'

History (Komut Geçmişi / Command History)

bash
history                      # Tum gecmisi goster
history 20                   # Son 20 komutu goster
!100                         # 100. komutu tekrar calistir
!!                           # Son komutu tekrar calistir
!ssh                         # "ssh" ile baslayan son komutu calistir
!?grep                       # "grep" iceren son komutu calistir

# History ayarlari (~/.bashrc)
export HISTSIZE=10000        # Bellekte tutulacak komut sayisi
export HISTFILESIZE=20000    # Dosyada tutulacak komut sayisi
export HISTCONTROL=ignoreboth  # Tekrarlari ve boslukla baslayanlari haric tut
export HISTIGNORE="ls:cd:pwd:exit:clear"  # Bu komutlari kaydetme
export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  "  # Zaman damgasi ekle

Ctrl Kısayolları (Ctrl Shortcuts)

Kısayolİşlem
Ctrl+CÇalışan komutu durdur
Ctrl+ZKomutu arka plana al (fg ile geri getir)
Ctrl+DOturumu kapat / EOF gönder
Ctrl+LEkranı temizle (clear)
Ctrl+ASatır başına git
Ctrl+ESatır sonuna git
Ctrl+Uİmleçten satır başına kadar sil
Ctrl+Kİmleçten satır sonuna kadar sil
Ctrl+WÖnceki kelimeyi sil
Ctrl+YSilinen metni yapıştır
Ctrl+RGeçmişte ara (reverse search)
Ctrl+Sİleri ara (Ctrl+R'nin tersi)
Ctrl+PÖnceki komut (yukarı ok)
Ctrl+NSonraki komut (aşağı ok)
Alt+BBir kelime geri git
Alt+FBir kelime ileri git
Alt+.Önceki komutun son argümanı

fzf -- Fuzzy Finder (Bulanık Arama)

bash
# Kurulum
sudo apt install fzf
# veya
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install

# Temel kullanim
fzf                                      # Dosya arama
cat dosya.txt | fzf                      # Satir arama
history | fzf                            # Gecmiste arama

# Onizleme ile
fzf --preview 'cat {}'                   # Dosya onizlemesi
fzf --preview 'head -100 {}'             # Ilk 100 satir onizleme

# Entegrasyonlar (bash)
# Ctrl+T: Dosya arama
# Ctrl+R: Komut gecmisi arama
# Alt+C:  Dizin degistirme

# Pratik kullanim
# Dosya acma
vim $(fzf)

# Git branch secme
git checkout $(git branch | fzf)

# Process oldurme
kill -9 $(ps aux | fzf | awk '{print $2}')

# Docker container secme
docker exec -it $(docker ps --format "{{.Names}}" | fzf) /bin/bash

bat -- Geliştirilmiş cat (Enhanced cat)

bash
# Kurulum
sudo apt install bat
# Ubuntu'da batcat olarak kurulur, alias olusturun:
alias bat="batcat"

# Kullanim
bat dosya.py                     # Syntax highlight ile goster
bat -n dosya.py                  # Satir numaralari ile
bat --style=plain dosya.py       # Duz gosterim
bat -l python script.txt         # Dil belirt
bat dosya1.py dosya2.py          # Birden fazla dosya

# grep ile entegrasyon
grep -rn "TODO" src/ | bat -l log
bash
# Kurulum
sudo apt install ripgrep

# Temel kullanim
rg "pattern" .                   # Recursive arama
rg -i "error" /var/log/          # Buyuk/kucuk harf duyarsiz
rg -l "TODO" src/                # Sadece dosya adlarini goster
rg -c "import" src/              # Eslesme sayisi
rg -n "function" --type py       # Satir numaralari + dosya tipi
rg --type-list                   # Desteklenen dosya tiplerini goster

# Gelismis arama
rg "error" --glob "*.log"        # Sadece .log dosyalarinda
rg "TODO|FIXME|HACK" src/        # Coklu pattern
rg -A 3 -B 1 "error" log.txt    # Context ile
rg --hidden "secret"             # Gizli dosyalarda da ara
rg -w "test"                     # Tam kelime eslesmesi

# grep yerine rg
rg "pattern" --json              # JSON formatinda cikti
rg -U "multi\nline"              # Cok satirli arama
rg --stats "error" /var/log/     # Istatistiklerle birlikte

Kullanıcı ve Grup Yönetimi (User & Group Management)

bash
# Kullanici islemleri
sudo adduser yeni_kullanici              # Kullanici olustur (interaktif)
sudo useradd -m -s /bin/bash kullanici   # Kullanici olustur (non-interaktif)
sudo userdel -r kullanici                # Kullanici sil (home dahil)
sudo passwd kullanici                    # Sifre degistir
sudo usermod -aG docker kullanici        # Gruba ekle
id kullanici                             # Kullanici bilgisi
whoami                                   # Mevcut kullanici
who                                      # Sisteme bagli kullanicilar
w                                        # Aktif kullanicilar ve ne yaptiklari

# Grup islemleri
sudo groupadd gelistiriciler             # Grup olustur
sudo groupdel gelistiriciler             # Grup sil
sudo usermod -aG gelistiriciler ali      # Kullaniciyi gruba ekle
groups kullanici                         # Kullanicinin gruplari
getent group gelistiriciler              # Gruptaki kullanicilar

Systemd Servis Yönetimi (Systemd Service Management)

bash
# Servis islemleri
sudo systemctl start nginx           # Servisi baslat
sudo systemctl stop nginx            # Servisi durdur
sudo systemctl restart nginx         # Yeniden baslat
sudo systemctl reload nginx          # Yapilandirmayi yeniden yukle
sudo systemctl status nginx          # Durumu goster
sudo systemctl enable nginx          # Acilista otomatik baslat
sudo systemctl disable nginx         # Otomatik baslatmayi kapat
sudo systemctl is-active nginx       # Aktif mi?
sudo systemctl is-enabled nginx      # Otomatik baslatma acik mi?

# Servis listesi
systemctl list-units --type=service                # Aktif servisler
systemctl list-units --type=service --state=failed  # Basarisiz servisler

# Journal loglari
journalctl -u nginx                  # Servis loglari
journalctl -u nginx -f               # Canli takip
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx --since today
journalctl -p err                    # Sadece hatalar
journalctl --disk-usage              # Log disk kullanimi

Özel servis dosyası (/etc/systemd/system/myapp.service):

ini
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/node /var/www/myapp/server.js
Restart=on-failure
RestartSec=5
Environment=NODE_ENV=production
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
bash
# Ozel servisi etkinlestir
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

Paket Yönetimi — apt (Package Management)

bash
# Paket listesini güncelle (update package list)
sudo apt update

# Tüm paketleri güncelle (upgrade all packages)
sudo apt upgrade -y

# Tek paket kur (install package)
sudo apt install nginx

# Birden fazla paket kur
sudo apt install curl wget git unzip htop

# Paket kaldır (remove package)
sudo apt remove nginx

# Paket + config dosyalarını kaldır (purge)
sudo apt purge nginx

# Kullanılmayan bağımlılıkları temizle (remove unused dependencies)
sudo apt autoremove -y

# Paket ara (search package)
apt search redis
apt list --installed | grep php    # Kurulu paketlerde ara

# Paket bilgisi (package info)
apt show nginx

# .deb dosyasından kur (install from .deb file)
sudo dpkg -i paket.deb
sudo apt install -f               # Bağımlılık sorunlarını çöz

# PPA ekleme (add PPA repository)
sudo add-apt-repository ppa:ondrej/php
sudo apt update

# PPA kaldırma
sudo add-apt-repository --remove ppa:ondrej/php
KomutAçıklama (Description)
apt updatePaket listesini güncelle
apt upgradeKurulu paketleri güncelle
apt install XPaket kur
apt remove XPaket kaldır (config kalır)
apt purge XPaket + config kaldır
apt autoremoveGereksiz bağımlılıkları sil
apt search XPaket ara
apt show XPaket detayı
apt list --installedKurulu paketleri listele
dpkg -i X.deb.deb dosyasından kur
snap install XSnap paket kur

sudo & Yetki Yönetimi (sudo & Privilege Management)

bash
# Root olarak komut çalıştır (run as root)
sudo komut
sudo apt update

# Root shell'e geç (switch to root shell)
sudo -i            # root olarak login
sudo su            # root kullanıcıya geç
exit               # root'tan çık

# Başka kullanıcı olarak çalıştır (run as another user)
sudo -u www-data whoami
sudo -u postgres psql

# sudo yetkisi ver (grant sudo access)
sudo usermod -aG sudo kullanici_adi

# sudoers dosyasını düzenle (edit sudoers — her zaman visudo kullan)
sudo visudo
# Ekle: kullanici_adi ALL=(ALL:ALL) ALL
# Şifresiz sudo: kullanici_adi ALL=(ALL) NOPASSWD: ALL

# Son sudo komutunu tekrar çalıştır
sudo !!

# sudo cache'i temizle (her seferinde şifre sor)
sudo -k

nano & vim — Terminal Editörleri (Terminal Text Editors)

nano (basit, yeni başlayanlar için / beginner-friendly)

bash
# Dosya aç (open file)
nano dosya.txt
sudo nano /etc/nginx/nginx.conf    # root yetkisiyle

# Yeni dosya oluştur (create new file)
nano yeni_dosya.txt
KısayolAçıklama (Description)
Ctrl+OKaydet (save)
Ctrl+XÇık (exit) — kaydedilmemişse sorar
Ctrl+KSatırı kes (cut line)
Ctrl+UYapıştır (paste)
Ctrl+WAra (search)
Ctrl+\Bul ve değiştir (find & replace)
Ctrl+GYardım (help)
Ctrl+Cİmleç konumunu göster (cursor position)
Alt+UGeri al (undo)
Alt+EYinele (redo)
Ctrl+_Satır numarasına git (go to line)
Alt+NSatır numaralarını göster/gizle

vim (güçlü, öğrenme eğrisi yüksek / powerful, steep learning curve)

bash
vim dosya.txt
sudo vim /etc/hosts
ModGeçişAçıklama
NormalEscNavigasyon ve komutlar
Inserti veya aMetin yazma
VisualvMetin seçme
Command:Komut satırı
KomutAçıklama (Description)
iInsert moda geç (yazma)
EscNormal moda dön
:wKaydet (save)
:qÇık (quit)
:wq veya ZZKaydet ve çık
:q!Kaydetmeden çık (force quit)
ddSatırı sil (delete line)
yySatırı kopyala (yank line)
pYapıştır (paste)
uGeri al (undo)
Ctrl+RYinele (redo)
/kelimeAra (search) — n sonraki, N önceki
:%s/eski/yeni/gTümünü değiştir (replace all)
ggDosya başına git
GDosya sonuna git
:set numberSatır numaralarını göster

Sistem İzleme & Kaynak Kontrolü (System Monitoring & Resources)

RAM & Bellek Kullanımı (Memory Usage)

bash
# RAM durumu (memory status)
free -h                      # İnsan okunabilir format
free -h --total               # Toplam ile birlikte

# Çıktı açıklaması:
#               total    used    free    shared  buff/cache  available
# Mem:          16Gi     8Gi     2Gi     512Mi   6Gi         7Gi
# Swap:         4Gi      0Bi     4Gi
#
# "available" → yeni uygulamalar için kullanılabilir gerçek bellek

# Hangi proses ne kadar RAM kullanıyor? (top memory consumers)
ps aux --sort=-%mem | head -15

# Detaylı bellek bilgisi
cat /proc/meminfo | head -10

# Swap kullanımı detaylı
swapon --show
cat /proc/swaps

CPU Kullanımı (CPU Usage)

bash
# Anlık CPU bilgisi
nproc                        # CPU çekirdek sayısı
lscpu                        # Detaylı CPU bilgisi
uptime                       # Yük ortalaması (load average)

# CPU tüketen prosesler (top CPU consumers)
ps aux --sort=-%cpu | head -15

# Canlı izleme
top                          # Temel izleme
htop                         # Gelişmiş izleme (sudo apt install htop)

Açık Portlar & Dinleyen Servisler (Open Ports & Listening Services)

bash
# Dinleyen portları göster (show listening ports)
ss -tuln                     # TCP + UDP, listening, numeric
ss -tlnp                     # TCP + proses bilgisi ile

# Belirli port kullanılıyor mu? (is specific port in use?)
ss -tlnp | grep :3306        # MySQL portu
ss -tlnp | grep :80          # HTTP
ss -tlnp | grep :443         # HTTPS
ss -tlnp | grep :5432        # PostgreSQL

# Hangi proses hangi portu kullanıyor? (which process uses which port?)
sudo lsof -i :80             # 80 portundaki proses
sudo lsof -i -P -n           # Tüm network bağlantıları

# Aktif bağlantılar (active connections)
ss -tn state established     # Kurulu TCP bağlantıları
ss -s                        # Bağlantı özeti (summary)

# Eski yöntem (legacy — netstat)
# sudo apt install net-tools
# netstat -tuln
# netstat -tlnp
KomutAçıklama
ss -tulnDinleyen TCP/UDP portları
ss -tlnpPortlar + proses adı
lsof -i :PORTPort kullanan proses
lsof -i -P -nTüm network bağlantıları
ss -sBağlantı istatistik özeti

Disk Kullanımı (Disk Usage)

bash
# Disk alanı (disk space)
df -h                        # Bağlı diskler ve kullanım
df -h /                      # Kök dizin kullanımı

# Klasör boyutları (directory sizes)
du -sh /var/log              # Tek klasör boyutu
du -sh /var/log/*            # Alt klasör detayı
du -sh * | sort -rh | head -10   # En büyük 10 klasör/dosya

# En büyük dosyaları bul (find largest files)
find / -type f -size +100M 2>/dev/null | head -20

Linux Güvenlik (Linux Security)

UFW — Güvenlik Duvarı (Firewall)

bash
# UFW kur ve aktifle (install and enable)
sudo apt install ufw
sudo ufw enable

# Durum kontrolü (status check)
sudo ufw status verbose

# Temel kurallar (basic rules)
sudo ufw allow ssh             # SSH (22) izin ver
sudo ufw allow 80/tcp          # HTTP izin ver
sudo ufw allow 443/tcp         # HTTPS izin ver
sudo ufw allow 3306/tcp        # MySQL (dikkatli ol!)

# Belirli IP'den izin ver (allow from specific IP)
sudo ufw allow from 192.168.1.100 to any port 22

# Kural sil (delete rule)
sudo ufw status numbered       # Numaralı liste
sudo ufw delete 3              # 3 numaralı kuralı sil
sudo ufw delete allow 3306/tcp # Kuralı direkt sil

# Tüm gelen trafiği engelle, sadece izin verilenleri aç (default deny)
sudo ufw default deny incoming
sudo ufw default allow outgoing
KomutAçıklama
ufw enableGüvenlik duvarını aktifle
ufw disableGüvenlik duvarını kapat
ufw statusKuralları göster
ufw allow PORTPortu aç
ufw deny PORTPortu engelle
ufw resetTüm kuralları sıfırla

fail2ban — Brute Force Koruması (Brute Force Protection)

bash
# Kur (install)
sudo apt install fail2ban

# Yapılandırma (configuration)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
ini
# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h          # Yasaklama süresi (ban duration)
findtime = 10m         # Bu süre içinde
maxretry = 5           # Bu kadar başarısız deneme → ban

[sshd]
enabled = true
port    = ssh
logpath = /var/log/auth.log
maxretry = 3           # SSH için 3 deneme

[nginx-http-auth]
enabled = true
port    = http,https
logpath = /var/log/nginx/error.log
bash
# Servis yönetimi
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Durum kontrolü
sudo fail2ban-client status
sudo fail2ban-client status sshd    # SSH jail durumu

# Yasaklı IP'leri göster (show banned IPs)
sudo fail2ban-client status sshd | grep "Banned IP"

# IP yasağını kaldır (unban IP)
sudo fail2ban-client set sshd unbanip 192.168.1.50

SSH Güvenlik Sertleştirme (SSH Hardening)

bash
sudo nano /etc/ssh/sshd_config
ini
# Önerilen ayarlar (recommended settings)
Port 2222                        # Varsayılan 22'den değiştir
PermitRootLogin no               # Root SSH girişini kapat
PasswordAuthentication no        # Sadece key ile giriş (SSH key only)
MaxAuthTries 3                   # Maksimum deneme
ClientAliveInterval 300          # 5 dk inaktif → bağlantı kes
ClientAliveCountMax 2            # 2 kontrol sonrası kes
AllowUsers fahri deployer        # Sadece bu kullanıcılar girebilir
bash
# Değişiklikleri uygula (apply changes)
sudo systemctl restart sshd

# SSH key ile giriş ayarla (setup SSH key login)
ssh-keygen -t ed25519 -C "fahri@sunucu"
ssh-copy-id -i ~/.ssh/id_ed25519.pub kullanici@sunucu_ip

Güvenlik Kontrol Listesi (Security Checklist)

bash
# 1. Açık portları kontrol et — gereksiz olanları kapat
sudo ss -tlnp

# 2. Çalışan servisleri kontrol et — gereksiz olanları durdur
sudo systemctl list-units --type=service --state=running

# 3. Başarısız giriş denemeleri (failed login attempts)
sudo lastb | head -20            # Başarısız girişler
sudo last | head -20             # Başarılı girişler
sudo grep "Failed password" /var/log/auth.log | tail -20

# 4. Sistem güncellemeleri (system updates)
sudo apt update && sudo apt upgrade -y

# 5. Otomatik güvenlik güncellemeleri (automatic security updates)
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

# 6. Dosya izinlerini kontrol et (check file permissions)
find / -perm -4000 2>/dev/null   # SUID bit'li dosyalar (güvenlik riski olabilir)
find /home -type f -perm 0777    # Herkese açık dosyalar

# 7. Aktif kullanıcıları göster (show active users)
w                                # Kim ne yapıyor
who                              # Bağlı kullanıcılar
last -10                         # Son 10 giriş

DevOps & Tools (DevOps ve Araçlar)

Diğer Kategoriler (Other Categories)

Developer Guides & Technical References