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)
# 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 listeleFaydalı flag kombinasyonları:
ls -lahS # Gizli dahil, okunabilir boyut, boyuta gore sirali
ls -lt --color=auto # Tarih siralama + renkli cikti
ls -la --group-directories-first # Dizinleri basta gostercd -- Dizin Değiştirme (Change Directory)
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 gitcp -- Kopyalama (Copy)
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)
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 tasirm -- Silme (Remove)
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 gosterGüvenlik notu: rm -rf / veya rm -rf * gibi komutlardan kaçının. Önemli dosyaları silmeden önce ls ile kontrol edin.
find -- Dosya Arama (File Search)
# 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" -printtree -- Dizin Ağacı (Directory Tree)
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 gosterln -- Link Oluşturma (Create Links)
# 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 gosterSoft link vs Hard link:
| Özellik | Soft Link | Hard Link |
|---|---|---|
| Farklı partition | Evet | Hayır |
| Dizinlere link | Evet | Hayır |
| Orijinal silinirse | Kırık link | Çalışmaya devam |
| Inode | Farklı | Aynı |
Metin İşleme (Text Processing)
cat -- Dosya İçeriğini Görüntüleme (View File Contents)
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 ekleAlternatifler:
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 takibigrep -- Metin Arama (Text Search - Detailed)
# 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 taramased -- Metin Düzenleyici (Stream Editor)
# 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 gosterawk -- Metin İşleme Dili (Text Processing Language)
# 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 listelesort, uniq, wc, cut (Sorting, Uniqueness, Counting, Cutting)
# 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 itibarenPipe ve Redirection (Pipes & I/O Redirection)
Pipe ( | ) (Chaining Commands)
Bir komutun çıktısını başka bir komutun girdisi olarak kullanır.
# 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 -rnRedirection
# 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
EOFxargs -- Argüman Oluşturucu (Argument Builder)
# 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 aratee -- Çıktıyı Bölümleme (Split Output)
# 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 kaydetDosya İ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ı | İzin | Anlam |
|---|---|---|
| 0 | --- | İzin yok |
| 1 | --x | Çalıştırma |
| 2 | -w- | Yazma |
| 3 | -wx | Yazma + Çalıştırma |
| 4 | r-- | Okuma |
| 5 | r-x | Okuma + Çalıştırma |
| 6 | rw- | Okuma + Yazma |
| 7 | rwx | Tam izin |
# 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 eklechown -- Sahiplik Değiştirme (Change Ownership)
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)
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 775Hesaplama: Dosya için 666 - umask, dizin için 777 - umask.
SUID, SGID ve Sticky Bit (Special Permissions)
# 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)
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 bilgisitop / htop -- Canlı İzleme (Live Monitoring)
# 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: Cikkill -- Proses Sonlandırma (Terminate Process)
# 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 listelenohup -- Arka Plan Çalıştırma (Background Execution)
# 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 kesscreen -- Terminal Multiplexer (Terminal Sessions)
# 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)
# 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 siltmux kısayolları (Ctrl+B öneki):
| Kısayol | İşlem |
|---|---|
Ctrl+B c | Yeni pencere |
Ctrl+B n | Sonraki pencere |
Ctrl+B p | Onceki pencere |
Ctrl+B 0-9 | Pencere numarasina git |
Ctrl+B , | Pencere yeniden adlandir |
Ctrl+B & | Pencereyi kapat |
Ctrl+B % | Dikey bol |
Ctrl+B " | Yatay bol |
Ctrl+B o | Paneller arasi gec |
Ctrl+B x | Paneli kapat |
Ctrl+B z | Paneli buyut/kucult |
Ctrl+B d | Detach |
Ctrl+B [ | Scroll modu |
Ctrl+B : | Komut modu |
tmux yapılandırması (~/.tmux.conf):
# 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 50000Network Araçları (Network Tools)
curl -- HTTP İstemci (HTTP Client - Detailed)
# 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 suresiwget -- Dosya İndirme (File Download)
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 indirss -- Soket İstatistikleri (Socket Statistics)
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 soketlerping, dig (Network Diagnostics)
# 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 gosternmap -- Port Tarama (Port Scanning - Brief)
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)
df # Tum disk bolumleri
df -h # Okunabilir format (GB, MB)
df -h / # Belirli bolum
df -hT # Dosya sistemi tipi ile
df -i # Inode kullanimidu -- Dizin Boyutu (Directory Size)
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 -1tar -- Arşivleme (Archiving)
# 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)
# 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 listeleSSH -- Güvenli Uzak Bağlantı (Secure Remote Connection - Detailed)
SSH Key Oluşturma (Generate SSH Keys)
# 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/configSSH Config Dosyası (SSH Configuration File)
# 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_keyKullanim:
ssh production # ssh deploy@203.0.113.10 -p 2222 yerine
ssh dev # Kisaltilmis baglantiscp -- Güvenli Kopyalama (Secure Copy)
# 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)
# 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ı:
| Flag | Anlam |
|---|---|
-a | Archive mod (recursive + izinleri koru) |
-v | Verbose (detaylı çıktı) |
-z | Transfer sırasında sıkıştır |
-P | --progress + --partial (ilerleme + kesilen transferi devam ettir) |
--delete | Kaynakta olmayanları hedeften sil |
--dry-run | Değ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ş.
# 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@sunucuRemote Port Forwarding (Uzak Port Yönlendirme)
Yerel makinenizdeki bir servisi uzak sunucu üzerinden erişime aç.
# 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@sunucuDynamic Port Forwarding (SOCKS Proxy)
# 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.comSSH Güvenlik (SSH Security)
# /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:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600Bash Scripting (Kabuk Betikleri)
Değişkenler (Variables)
#!/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)
#!/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"
fiKarşılaştırma operatörleri:
| Operator | Anlam |
|---|---|
-eq | Eşit (equal) |
-ne | Eşit değil (not equal) |
-gt | Büyük (greater than) |
-ge | Büyük eşit (greater or equal) |
-lt | Küçük (less than) |
-le | Küçük eşit (less or equal) |
Dosya test operatörleri:
| Operator | Anlam |
|---|---|
-f | Dosya var mı |
-d | Dizin var mı |
-e | Var mı (dosya veya dizin) |
-r | Okunabilir mi |
-w | Yazılabilir mi |
-x | Çalıştırılabilir mi |
-s | Boyutu 0'dan büyük mü |
-L | Sembolik link mi |
case yapısı:
#!/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
;;
esacDöngüler (Loops - for / while)
#!/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
doneFonksiyonlar (Functions)
#!/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)
#!/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)
#!/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)
#!/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 -sLog Analiz Script'i (Log Analysis Script)
#!/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 -10Cron -- 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)
crontab -e # Cron gorevlerini duzenle
crontab -l # Mevcut gorevleri listele
crontab -r # Tum gorevleri sil
crontab -u kullanici -l # Baska kullanicinin gorevleriCron Örnekleri Tablosu (Cron Examples Table)
| Expression | Açı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 * * 0 | Her pazar gece yarisi |
0 0 * * 1-5 | Hafta 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-5 | Hafta 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)
# 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 loglariCron Özel Kısayollar (Special Cron Shortcuts)
| Kısayol | Anlam |
|---|---|
@reboot | Sistem başlatıldığında |
@yearly | Yılda bir (0 0 1 1 *) |
@monthly | Ayda bir (0 0 1 * *) |
@weekly | Haftada bir (0 0 * * 0) |
@daily | Günde bir (0 0 * * *) |
@hourly | Saatte bir (0 * * * *) |
@reboot /home/user/scripts/baslangic.sh
@daily /home/user/scripts/gunluk_yedek.shOne-Liner Koleksiyonu (One-Liner Collection)
Dosya İşlemleri (File Operations)
# 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.txtMetin İşlemleri (Text Operations)
# 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 -dNetwork İşlemleri (Network Operations)
# 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"
doneProcess İşlemleri (Process Operations)
# 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)
# 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 -10Docker İşlemleri (Docker Operations)
# 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:
# 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)
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 ekleCtrl Kısayolları (Ctrl Shortcuts)
| Kısayol | İşlem |
|---|---|
Ctrl+C | Çalışan komutu durdur |
Ctrl+Z | Komutu arka plana al (fg ile geri getir) |
Ctrl+D | Oturumu kapat / EOF gönder |
Ctrl+L | Ekranı temizle (clear) |
Ctrl+A | Satır başına git |
Ctrl+E | Satı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+Y | Silinen metni yapıştır |
Ctrl+R | Geçmişte ara (reverse search) |
Ctrl+S | İleri ara (Ctrl+R'nin tersi) |
Ctrl+P | Önceki komut (yukarı ok) |
Ctrl+N | Sonraki komut (aşağı ok) |
Alt+B | Bir kelime geri git |
Alt+F | Bir kelime ileri git |
Alt+. | Önceki komutun son argümanı |
fzf -- Fuzzy Finder (Bulanık Arama)
# 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/bashbat -- Geliştirilmiş cat (Enhanced cat)
# 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 logripgrep (rg) -- Hızlı Arama (Fast Search)
# 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 birlikteKullanıcı ve Grup Yönetimi (User & Group Management)
# 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 kullanicilarSystemd Servis Yönetimi (Systemd Service Management)
# 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):
[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# Ozel servisi etkinlestir
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myappPaket Yönetimi — apt (Package Management)
# 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| Komut | Açıklama (Description) |
|---|---|
apt update | Paket listesini güncelle |
apt upgrade | Kurulu paketleri güncelle |
apt install X | Paket kur |
apt remove X | Paket kaldır (config kalır) |
apt purge X | Paket + config kaldır |
apt autoremove | Gereksiz bağımlılıkları sil |
apt search X | Paket ara |
apt show X | Paket detayı |
apt list --installed | Kurulu paketleri listele |
dpkg -i X.deb | .deb dosyasından kur |
snap install X | Snap paket kur |
sudo & Yetki Yönetimi (sudo & Privilege Management)
# 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 -knano & vim — Terminal Editörleri (Terminal Text Editors)
nano (basit, yeni başlayanlar için / beginner-friendly)
# 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ısayol | Açıklama (Description) |
|---|---|
Ctrl+O | Kaydet (save) |
Ctrl+X | Çık (exit) — kaydedilmemişse sorar |
Ctrl+K | Satırı kes (cut line) |
Ctrl+U | Yapıştır (paste) |
Ctrl+W | Ara (search) |
Ctrl+\ | Bul ve değiştir (find & replace) |
Ctrl+G | Yardım (help) |
Ctrl+C | İmleç konumunu göster (cursor position) |
Alt+U | Geri al (undo) |
Alt+E | Yinele (redo) |
Ctrl+_ | Satır numarasına git (go to line) |
Alt+N | Satır numaralarını göster/gizle |
vim (güçlü, öğrenme eğrisi yüksek / powerful, steep learning curve)
vim dosya.txt
sudo vim /etc/hosts| Mod | Geçiş | Açıklama |
|---|---|---|
| Normal | Esc | Navigasyon ve komutlar |
| Insert | i veya a | Metin yazma |
| Visual | v | Metin seçme |
| Command | : | Komut satırı |
| Komut | Açıklama (Description) |
|---|---|
i | Insert moda geç (yazma) |
Esc | Normal moda dön |
:w | Kaydet (save) |
:q | Çık (quit) |
:wq veya ZZ | Kaydet ve çık |
:q! | Kaydetmeden çık (force quit) |
dd | Satırı sil (delete line) |
yy | Satırı kopyala (yank line) |
p | Yapıştır (paste) |
u | Geri al (undo) |
Ctrl+R | Yinele (redo) |
/kelime | Ara (search) — n sonraki, N önceki |
:%s/eski/yeni/g | Tümünü değiştir (replace all) |
gg | Dosya başına git |
G | Dosya sonuna git |
:set number | Satır numaralarını göster |
Sistem İzleme & Kaynak Kontrolü (System Monitoring & Resources)
RAM & Bellek Kullanımı (Memory Usage)
# 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/swapsCPU Kullanımı (CPU Usage)
# 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)
# 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| Komut | Açıklama |
|---|---|
ss -tuln | Dinleyen TCP/UDP portları |
ss -tlnp | Portlar + proses adı |
lsof -i :PORT | Port kullanan proses |
lsof -i -P -n | Tüm network bağlantıları |
ss -s | Bağlantı istatistik özeti |
Disk Kullanımı (Disk Usage)
# 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 -20Linux Güvenlik (Linux Security)
UFW — Güvenlik Duvarı (Firewall)
# 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| Komut | Açıklama |
|---|---|
ufw enable | Güvenlik duvarını aktifle |
ufw disable | Güvenlik duvarını kapat |
ufw status | Kuralları göster |
ufw allow PORT | Portu aç |
ufw deny PORT | Portu engelle |
ufw reset | Tüm kuralları sıfırla |
fail2ban — Brute Force Koruması (Brute Force Protection)
# 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# /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# 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.50SSH Güvenlik Sertleştirme (SSH Hardening)
sudo nano /etc/ssh/sshd_config# Ö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# 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_ipGüvenlik Kontrol Listesi (Security Checklist)
# 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şİlgili Rehberler (Related Guides)
DevOps & Tools (DevOps ve Araçlar)
- DevOps Genel Bakış
- Git Notları
- Docker Rehberi
- Kubernetes
- Nginx Rehberi
- Deployment & Hosting
- Ubuntu Rehberi
- VS Code Rehberi
- Regex Rehberi