Terminal ekranına ilk baktığında siyah bir boşluk ve yanıp sönen bir imleç seni karşılar. Çoğu kişi bu noktada geri adım atar. Oysa bu ekran, bir Linux sistem yöneticisinin en güçlü silahıdır. Yıllar içinde öğrendim ki terminal korkusu, aslında “bilmemek” korkusudur. Bir kez temel kavramları oturttuğunda, terminali bırakmak istemiyorsun.
Bu yazıda sıfırdan başlayarak Linux terminalini anlamlandıracağız. Sadece komutları ezberletmeyeceğim, arkasındaki mantığı da göstereceğim. Çünkü mantığı anlarsan, hiç görmediğin bir komutu bile tahmin edebilirsin.
Terminal Nedir, Shell Nedir?
Önce iki kavramı birbirinden ayıralım çünkü çoğu kaynak bunları karıştırıyor.
Terminal (ya da terminal emülatör), ekranda gördüğün penceredir. GNOME Terminal, Konsole, iTerm2 bunların örnekleridir. Sadece bir arayüzdür, asıl iş yapan o değildir.
Shell ise yazdığın komutları yorumlayan programdır. Bash, Zsh, Fish bunların en bilinenleridir. Terminale bir komut yazıp Enter’a bastığında, o komutu shell alır, işletim sistemine iletir ve sonucu sana geri döndürür.
Yani terminal bir ekrandır, shell ise düşünen beyindir. Günlük kullanımda ikisi için de “terminal” deriz ama aradaki farkı bilmek, ileride karşılaşacağın hata mesajlarını çözerken işine yarar.
Hangi shell kullandığını öğrenmek için şunu yazabilirsin:
echo $SHELL
Büyük ihtimalle /bin/bash ya da /bin/zsh göreceksin. Ubuntu gibi popüler dağıtımlarda varsayılan shell Bash’tir.
Komut Satırı Yapısı: Anatomiye Bakış
Her Linux komutu aynı yapıyı takip eder. Bunu bir kez anlarsan her şey yerine oturur:
komut [seçenekler] [argümanlar]
Gerçek bir örnekle bakalım:
ls -la /home/kullanici
Burada:
- ls: Komutun kendisi (list = listele)
- -la: Seçenekler (l = uzun format, a = gizli dosyaları da göster)
- /home/kullanici: Argüman (nereyi listeleyeceğimiz)
Seçenekler genellikle tek tire ile tek harfli (-l) ya da çift tire ile uzun yazılır (--all). İkisi de aynı şeyi yapabilir:
ls -a
ls --all
Bu yapıyı aklına kazı. İleride hiç görmediğin bir komutla karşılaştığında, mantığını bu iskeletle çözebilirsin.
İlk Adım: Neredeyim?
Terminali açtığında ilk sorman gereken soru “neredeyim?” olmalı. Linux’ta her şey bir dizin yapısı içinde yaşar. Bulunduğun yeri öğrenmek için:
pwd
pwd “print working directory” yani “çalışma dizinini yazdır” demek. Çıktı olarak şöyle bir şey görürsün:
/home/ahmet
Bu, şu an /home/ahmet dizininde olduğunu söylüyor. Linux’ta dizin yapısı / ile başlar (root dizini) ve aşağıya doğru dallanır. Windows’taki C: mantığının Linux karşılığı / işaretidir.
Dizin Yapısını Anlamak
Linux dizin yapısını anlamadan terminalde kaybolursun. İşte sık karşılaşacağın ana dizinler:
- /: Her şeyin başladığı kök dizin
- /home: Kullanıcı ev dizinleri burada.
/home/ahmet,/home/mehmetgibi - /etc: Sistem konfigürasyon dosyaları
- /var: Değişken veriler, log dosyaları
- /tmp: Geçici dosyalar, sistem yeniden başlayınca temizlenir
- /usr: Kullanıcı programları ve kütüphaneler
- /bin ve /sbin: Temel sistem komutları
- /root: Root kullanıcısının ev dizini (dikkat: /home/root değil, direkt /root)
Kendi ev dizinine hızlıca dönmek için tek başına cd yazman yeterli:
cd
Ya da tilde (~) karakterini kullanabilirsin:
cd ~
Her ikisi de seni /home/kullanici_adin dizinine götürür.
Hareket Etmek: cd Komutu
Dizin yapısını anladıktan sonra içinde gezinmeyi öğrenelim. cd (change directory) komutu bunun için:
# Belirli bir dizine git
cd /etc
# Bir üst dizine çık
cd ..
# İki üst dizine çık
cd ../..
# Son bulunduğun dizine geri dön (çok kullanışlı!)
cd -
O son komut cd - gerçek hayatta inanılmaz işe yarar. Diyelim ki /var/log/nginx dizinindesin ve /etc/nginx dizinine geçtin. Geri dönmek için tekrar /var/log/nginx yazmak zorunda değilsin:
cd -
Bu seni bir önceki dizine götürür. Sysadmin olarak iki dizin arasında sürekli geçiş yapıyorsan bu komutu seveceksin.
Listelemek: ls Komutu
ls komutu bir dizinin içindekileri gösterir. Ama tek başına çok bilgi vermez. İşte en kullandığım kombinasyonlar:
# Temel listeleme
ls
# Gizli dosyalar dahil tüm dosyaları göster
ls -a
# Uzun format: izinler, sahip, boyut, tarih
ls -l
# İkisini birleştir, en çok kullandığım
ls -la
# Dosya boyutlarını okunabilir formatta göster (K, M, G)
ls -lh
# Tarihe göre sırala, en yeni en üstte
ls -lt
# Belirli bir dizini listele
ls -la /var/log
Çıktıda şöyle bir satır görürsün:
-rw-r--r-- 1 ahmet ahmet 4096 Oca 15 14:23 dosya.txt
drwxr-xr-x 2 root root 4096 Oca 10 09:00 dizin/
Baştaki harfler dosya izinleridir. - normal dosya, d dizin, l ise sembolik linktir. İzin konusuna ilerleyen yazılarda ayrıntılı gireceğiz ama şimdilik bu kadarını bil.
Dosya ve Dizin Oluşturmak
Pratik bir senaryo düşünelim: Yeni bir proje için dizin yapısı kuruyorsun.
# Yeni dizin oluştur
mkdir proje
# İç içe dizinler oluştur (parents flag ile)
mkdir -p proje/src/modules
# Boş dosya oluştur
touch proje/README.md
# Birden fazla dosya oluştur
touch proje/src/index.js proje/src/app.js
mkdir -p bayrağı çok önemli. -p olmadan, proje/src/modules oluşturmaya çalışırsan ve proje/src henüz yoksa hata alırsın. -p ile bütün zinciri tek seferde oluşturursun.
touch komutu aslında “dosyanın erişim zamanını güncelle” demek. Ama dosya yoksa onu oluşturur. Yeni boş dosya oluşturmak için standart yol haline gelmiştir.
Kopyalamak, Taşımak, Silmek
# Dosya kopyala
cp kaynak.txt hedef.txt
# Dosyayı başka dizine kopyala
cp kaynak.txt /tmp/
# Dizini kopyala (recursive flag zorunlu)
cp -r proje/ proje_yedek/
# Dosya taşı / yeniden adlandır
mv eski_isim.txt yeni_isim.txt
# Dosyayı başka dizine taşı
mv dosya.txt /home/ahmet/belgeler/
# Dosya sil
rm dosya.txt
# Dizin sil (içi boşsa)
rmdir bos_dizin
# Dizin ve içindekileri sil (dikkatli kullan!)
rm -rf dolu_dizin/
rm -rf komutu hakkında ciddi bir uyarı: Bu komut geri alınamaz. Linux’ta çöp kutusu kavramı yoktur, rm ile silinen dosya gider. -r recursive (içeridekileri de sil), -f ise force (sormadan zorla sil) demek. Production sunucuda yanlış dizinde rm -rf çalıştırmak kariyerini bitirebilir. Her zaman önce pwd ile nerede olduğunu kontrol et.
Gerçek dünyadan bir örnek: Bir şirkette stajyer yanlışlıkla / dizininde rm -rf * çalıştırdı. Tüm sistem gitti. Bu yüzden bu komutu kullanmadan önce on kez düşün.
Dosya İçeriğini Görüntülemek
Bir config dosyasına bakmak istiyorsun, ne yaparsın?
# Tüm dosyayı ekrana bas
cat /etc/hosts
# Büyük dosyalarda sayfalayarak göster (q ile çık)
less /var/log/syslog
# Sadece ilk 10 satırı göster
head /var/log/syslog
# Sadece son 10 satırı göster
tail /var/log/syslog
# Dosyayı gerçek zamanlı izle (log takibi için mükemmel)
tail -f /var/log/nginx/access.log
# Son 50 satırı gerçek zamanlı izle
tail -n 50 -f /var/log/nginx/error.log
tail -f bir sysadminin en sık kullandığı komutlardan biridir. Nginx ya da Apache loglarını canlı izlemek, uygulama hata loglarını takip etmek için olmazsa olmaz. Bir web sunucusu sorununu debug ederken tail -f /var/log/nginx/error.log açık tutup paralel olarak istekler atarsın, hataları anında görürsün.
Metin Arama: grep
grep olmadan terminal kullanmak, gözü bağlı çalışmak gibidir. Dosyalar içinde metin aramak için kullanılır:
# Dosyada metin ara
grep "hata" /var/log/syslog
# Büyük/küçük harf duyarsız arama
grep -i "error" /var/log/syslog
# Sadece eşleşme sayısını göster
grep -c "ERROR" /var/log/app.log
# Eşleşmenin bulunduğu satır numarasını göster
grep -n "PermitRootLogin" /etc/ssh/sshd_config
# Eşleşmeyen satırları göster (tersine arama)
grep -v "DEBUG" /var/log/app.log
# Tüm dosyalarda özyinelemeli ara
grep -r "password" /etc/
# Birden fazla dosyada ara ve hangi dosyada bulduğunu göster
grep -l "nginx" /etc/logrotate.d/*
Gerçek dünya senaryosu: Bir sunucuda SSH brute force saldırısı şüphesi var. Hangi IP’lerden başarısız giriş denemeleri geldiğini görmek istiyorsun:
grep "Failed password" /var/log/auth.log | grep -oP '(d{1,3}.){3}d{1,3}' | sort | uniq -c | sort -rn | head -20
Bu tek satır, başarısız SSH girişlerini IP’ye göre sayar ve en çok deneme yapanları sıralar. İlk bakışta karmaşık görünüyor ama pipe (|) mantığını öğrenince anlayacaksın.
Pipe ve Yönlendirme: Linux’un Süper Gücü
Pipe (|) karakteri, bir komutun çıktısını diğer komutun girdisi olarak kullanmana izin verir. Bu, Linux’un en güçlü özelliklerinden biridir.
# ls çıktısını grep'e ver, sadece .conf uzantılıları göster
ls /etc | grep ".conf"
# Çalışan processleri listele ve içinde nginx'i ara
ps aux | grep nginx
# Disk kullanımını boyuta göre sırala
du -sh /var/* | sort -h
Yönlendirme ise komut çıktısını dosyaya yazmanı sağlar:
# Çıktıyı dosyaya yaz (üzerine yazar)
ls -la > dosya_listesi.txt
# Çıktıyı dosyaya ekle (üzerine yazmaz)
echo "Log girişi" >> uygulama.log
# Hata çıktısını ayrı dosyaya yaz
komut 2> hata.log
# Hem normal hem hata çıktısını aynı dosyaya yaz
komut > tum_cikti.log 2>&1
# Çıktıyı tamamen yut (sessiz mod)
komut > /dev/null 2>&1
Şu son komut çok işe yarar. Cron job yazarken ya da bir scriptin gereksiz çıktısını bastırmak istediğinde /dev/null kurtarıcın olur.
Yardım Almak: man ve –help
Yeni bir komutla karşılaştığında paniklemene gerek yok. Her komutun belgesi var:
# Komutun kılavuz sayfasını aç
man ls
# Kısa yardım metnini göster
ls --help
# Komut hakkında özet bilgi
whatis ls
# Anahtar kelimeyle komut ara
apropos "disk usage"
man komutunu açtığında j ile aşağı, k ile yukarı, / ile arama, q ile çıkış yapabilirsin. Bu vi/vim tuş kombinasyonlarıdır ve terminalde her yerde karşına çıkar.
Ben kişisel olarak önce --help bakarım, ayrıntı gerekirse man‘a geçerim. man sayfaları kapsamlı ama bazen fazla detaylı olabilir.
Kullanıcı ve İzin Bilgileri
Terminalde kimin kim olduğunu anlamak önemli:
# Mevcut kullanıcı adını göster
whoami
# Kullanıcı ve grup bilgilerini göster
id
# Sistemdeki aktif kullanıcıları göster
who
# Son giriş yapan kullanıcıları göster
last | head -20
Root olmayan bir kullanıcıyla sistem komutları çalıştırman gerekiyorsa sudo kullanırsın:
# Root yetkisiyle komut çalıştır
sudo apt update
# Root shell aç (dikkatli kullan)
sudo -i
# Belirli kullanıcı olarak komut çalıştır
sudo -u www-data php artisan cache:clear
sudo olmadan yapamayacağın şeylere sık sık “Permission denied” hatası alarak rastlarsın. Bu hata sana “bunu yapma iznin yok” diyor. Çözüm genellikle komutu sudo ile tekrar çalıştırmaktır. Ama her şeyi sudo ile çalıştırma alışkanlığı edinme, bu güvenlik açığı yaratır.
Sistem Durumunu Hızlıca Öğrenmek
Bir sunucuya ilk bağlandığında şu komutları çalıştırırım, adeta bir kontrol listesi gibi:
# Sistem ve kernel bilgisi
uname -a
# Ne kadar süredir açık, kaç kullanıcı var
uptime
# Disk kullanımı (human readable)
df -h
# Bellek kullanımı
free -h
# CPU ve süreç bilgisi (canlı)
top
# top'un daha modern versiyonu
htop
# Ağ bağlantılarını listele
ss -tulnp
df -h disk doluluk oranını gösterir. %95 üzerinde dolu bir partition ciddi sorunlara yol açar. free -h ise kullanılan ve boş RAM miktarını gösterir. Özellikle production sunuculara bağlandığında bu ikisini ilk kontrol etmeyi alışkanlık haline getir.
Komut Geçmişi ve Kısayollar
Terminali verimli kullanmak için bu kısayolları öğrenmek şart:
# Komut geçmişini göster
history
# Geçmişte komut ara (Ctrl+R ile de yapılır)
history | grep "nginx"
# Son çalıştırılan komutu tekrar çalıştır
!!
# Geçmişteki n. komutu çalıştır
!150
Klavye kısayolları:
- Ctrl+R: Komut geçmişinde geriye doğru ara
- Ctrl+C: Çalışan komutu iptal et
- Ctrl+L: Ekranı temizle (clear komutu ile aynı)
- Ctrl+A: Satır başına git
- Ctrl+E: Satır sonuna git
- Tab: Otomatik tamamla (en çok kullanılan!)
Tab tamamlama gerçekten hayat kurtarır. Uzun bir dizin yolu yazarken birkaç harf yazıp Tab’a basmayı dene. Sistem geri kalanını tamamlar. Eşleşme birden fazlaysa iki kez Tab’a bas, seçenekleri listeler.
Alias ile Kısayol Oluşturma
Sürekli yazdığın uzun komutları kısaltabilirsin:
# Geçici alias tanımla
alias ll='ls -la'
alias ..='cd ..'
alias update='sudo apt update && sudo apt upgrade -y'
# Mevcut alias'ları listele
alias
# Alias'ı kaldır
unalias ll
Bu alias’ları kalıcı hale getirmek için ~/.bashrc veya ~/.zshrc dosyasına eklemen gerekir. Aksi halde terminal kapanınca kaybolurlar. Kendi sunucularımda onlarca alias tanımlıyım, her birkaç ayda bir yeni birini ekliyorum.
Sonuç
Terminal korkusu birkaç temel komutu öğrendikten sonra hızla çözülür. Bugün öğrendiklerimiz: dizinlerde gezinmek, dosya işlemleri yapmak, içerikleri görüntülemek, metin aramak ve komutları birbirine bağlamak.
Bu komutları ezberlemene gerek yok. Her gün kullandıkça zaten içselleştireceksin. Önemli olan mantığı anlamak: komut + seçenekler + argümanlar yapısını, pipe ile komutları zincirleme fikrini ve man/--help ile kendi kendine öğrenebilme alışkanlığını edinmek.
Bir tavsiyem daha: Test etmekten korkma. rm -rf gibi tehlikeli komutlar dışında terminalde bir şey denerken çok az şey “kırılır”. Sanal makine ya da Docker container kurarak istediğin kadar deneme yapabilirsin. Ben yıllar önce birkaç kez sanal makine uçurdum, her seferinde bir şeyler öğrendim.
Bir sonraki yazıda dosya izinleri, sahiplik kavramları ve chmod/chown komutlarına bakacağız. O konuyu anladığında “Permission denied” hataları artık seni korkutmayacak.