
Giriş: Sistem Yönetiminde Bash'in Gücü
Linux ve Unix tabanlı sistemlerin kalbinde yer alan Bash (Bourne-Again SHell), sistem yöneticileri için vazgeçilmez bir araçtır. Komut satırı arayüzü üzerinden sistemle etkileşim kurmanın ötesinde, tekrarlayan görevleri otomatikleştirmek, karmaşık işlemleri basitleştirmek ve verimliliği artırmak için güçlü betikler yazmaya olanak tanır. Bir sistem yöneticisi olarak, Bash'e hakim olmak sadece iş akışınızı hızlandırmakla kalmaz, aynı zamanda sorun giderme ve sistem analizi yeteneklerinizi de önemli ölçüde geliştirir. Bu rehberde, Bash'in temelden ileri seviyeye kadar sistem yönetiminde nasıl kullanılabileceğini, pratik örneklerle ve dikkat edilmesi gereken noktalarla birlikte ele alacağız. Amacımız, hem yeni başlayanların hem de deneyimli kullanıcıların Bash yetkinliklerini bir üst seviyeye taşımasına yardımcı olmaktır.
1. Bash'in Temelleri: Komut Satırında Yaşamak
Her sistem yöneticisinin ilk durağı, temel Bash komutlarını anlamaktır. Bu komutlar, dosya ve dizin yönetimi, süreç kontrolü ve ağ işlemleri gibi günlük görevlerin temelini oluşturur.
Dosya ve Dizin Yönetimi:
- ls: Dizin içeriğini listeler.
Kod:
ls -lha /var/log
- cd: Dizin değiştirir.
Kod:
cd /etc/nginx/conf.d
- pwd: Mevcut çalışma dizinini gösterir.
Kod:
pwd
- cp: Dosya ve dizin kopyalar.
Kod:
cp /etc/fstab /tmp/fstab.bak
- mv: Dosya ve dizin taşır veya yeniden adlandırır.
Kod:
mv my_script.sh /usr/local/bin/
- rm: Dosya ve dizin siler. Dikkatli olun!
Kod:
rm -rf /path/to/my/sensitive/data
- mkdir: Dizin oluşturur.
Kod:
mkdir -p /var/www/html/mysite
- cat, less, more, tail, head: Dosya içeriğini görüntüler. Log dosyalarını incelerken çok kullanışlıdırlar.
Kod:
tail -f /var/log/syslog
Metin İşleme ve Arama:
- grep: Metin içerisinde desen arar.
Kod:
grep -i 'error' /var/log/apache2/error.log
- sed: Metin üzerinde akış düzenlemeleri yapar.
Kod:
sed 's/old_text/new_text/g' my_file.txt
- awk: Metin dosyalarını işlemek ve raporlamak için güçlü bir araç.
Kod:
awk '{print $1}' /etc/passwd
- find: Belirli kriterlere göre dosya ve dizin arar.
Kod:
find /var/www -name '*.php' -mtime +7 -delete
2. Süreç Yönetimi ve İzleme
Sistemde çalışan süreçleri yönetmek, performans sorunlarını teşhis etmek ve uygulamaların durumunu kontrol etmek için hayati öneme sahiptir.
- ps: Anlık süreçleri listeler.
Kod:
ps aux | grep nginx
- top/htop: Etkileşimli süreç izleme ve kaynak kullanımı görüntüler.
Kod:
top
- kill: Süreçleri sonlandırır.
Kod:
kill -9 12345
- jobs, bg, fg: Arka plandaki ve ön plandaki işleri yönetir.
Kod:
firefox &
- systemctl: Systemd servislerini yönetir (modern Linux dağıtımlarında).
Kod:
sudo systemctl restart apache2
3. Ağ Yönetimi Komutları
Ağ bağlantılarını kontrol etmek, sorun gidermek ve yapılandırmak için Bash komutları sıkça kullanılır.
- ping: Ağ bağlantısını test eder.
Kod:
ping google.com
- ip: Ağ arayüzlerini ve routing tablolarını yönetir (eski `ifconfig` yerine).
Kod:
ip a show eth0
- netstat/ss: Aktif bağlantıları, dinleyen portları gösterir.
Kod:
ss -tuln
- curl/wget: URL'lerden veri indirir veya HTTP istekleri yapar.
Kod:
curl -sL https://example.com/install.sh | bash
4. Kullanıcı ve İzin Yönetimi
Güvenlik ve erişim kontrolü için kullanıcı ve dosya izinlerini yönetmek elzemdir.
- useradd, userdel, usermod: Kullanıcı ekleme, silme, düzenleme.
Kod:
sudo useradd -m -s /bin/bash yenikullanici
- groupadd, groupdel, gpasswd: Grup yönetimi.
Kod:
sudo groupadd devops
- passwd: Kullanıcı şifresi belirleme.
Kod:
sudo passwd yenikullanici
- chmod: Dosya/dizin izinlerini değiştirir.
Kod:
chmod 755 script.sh
- chown: Dosya/dizin sahibini değiştirir.
Kod:
sudo chown www-data:www-data /var/www/html
5. Bash Betik Yazımının Temelleri
Tekrarlayan görevleri otomatikleştirmek için betik yazımı Bash'in en güçlü yönüdür. Bir Bash betiği genellikle
Kod:
#!/bin/bash
Değişkenler:
Bash'te değişken tanımlamak çok kolaydır. Örnek:
Kod:
#!/bin/bash
SERVER_NAME="web01.example.com"
LOG_DIR="/var/log/apache2"
echo "Sunucu Adı: $SERVER_NAME"
echo "Log Dizini: $LOG_DIR"
# Komut çıktısını değişkene atama
ACTIVE_USERS=$(who | wc -l)
echo "Aktif Kullanıcı Sayısı: $ACTIVE_USERS"
Kontrol Yapıları:
a) Koşullu İfadeler (if-else):
Kod:
#!/bin/bash
read -p "Bir sayı girin: " NUMBER
if [ "$NUMBER" -gt 10 ]; then
echo "Girdiğiniz sayı 10'dan büyük."
elif [ "$NUMBER" -eq 10 ]; then
echo "Girdiğiniz sayı tam olarak 10."
else
echo "Girdiğiniz sayı 10'dan küçük."
fi
b) Döngüler (for, while):
Kod:
#!/bin/bash
# For döngüsü: Dosyaları yedekleme
for FILE in /etc/*.conf; do
echo "Yedekleniyor: $FILE"
cp "$FILE" "${FILE}.bak"
done
# While döngüsü: Servis kontrolü
SERVICE="apache2"
while ! systemctl is-active --quiet $SERVICE; do
echo "$SERVICE servisi aktif değil. Bekleniyor..."
sleep 5
done
echo "$SERVICE servisi aktif ve çalışıyor."
Fonksiyonlar:
Kod tekrarını önlemek ve betiği daha okunabilir hale getirmek için fonksiyonlar kullanılır.
Kod:
#!/bin/bash
function log_message() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}
log_message "Betik başlatılıyor."
# İşlemler...
log_message "Tüm işlemler tamamlandı."
Giriş/Çıkış Yönlendirme ve Pipe:
- > Çıktıyı dosyaya yazar (üzerine yazar).
- >> Çıktıyı dosyanın sonuna ekler.
- < Dosya içeriğini komuta girdi olarak verir.
- 2> Hata çıktısını dosyaya yönlendirir.
- &> Hem standart hem de hata çıktısını yönlendirir.
- | (Pipe) Bir komutun çıktısını diğerine girdi olarak verir.
Kod:
ls -l | grep .txt
6. Pratik Otomasyon Senaryoları ve Betik Örnekleri
Bash betikleriyle otomasyon, sistem yöneticisinin hayatını kolaylaştıran kilit bir özelliktir. İşte bazı yaygın senaryolar:
a) Log Dosyası Temizliği:
Belirli bir süreden daha eski log dosyalarını silen basit bir betik:
Kod:
#!/bin/bash
LOG_DIR="/var/log/nginx"
DAYS_OLD=30
find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS_OLD -delete
# Betiği cron ile haftalık çalıştırma örneği:
# 0 3 * * 0 /path/to/clean_logs.sh
b) Basit Yedekleme Betiği:
Belirli bir dizini sıkıştırıp yedekleme dizinine kopyalar:
Kod:
#!/bin/bash
SOURCE_DIR="/var/www/html/mysite"
BACKUP_DIR="/mnt/backups/web_data"
DATE=$(date +%Y%m%d%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/mysite_backup_${DATE}.tar.gz"
mkdir -p "$BACKUP_DIR"
tar -czvf "$BACKUP_FILE" "$SOURCE_DIR"
if [ $? -eq 0 ]; then
echo "Yedekleme başarılı: $BACKUP_FILE"
# Eski yedekleri temizle (son 7 yedeği tut)
find "$BACKUP_DIR" -type f -name "mysite_backup_*.tar.gz" -mtime +7 -delete
else
echo "Yedekleme hatası!"
fi
c) Sistem Kaynak İzleme ve Uyarı:
Disk alanı belirli bir eşiğin altına düştüğünde uyarı gönderen bir betik:
Kod:
#!/bin/bash
DISK_USAGE_THRESHOLD=90 # Yüzde olarak
PARTITION="/"
CURRENT_USAGE=$(df "$PARTITION" | awk 'NR==2 {print $5}' | sed 's/%//g')
if [ "$CURRENT_USAGE" -ge "$DISK_USAGE_THRESHOLD" ]; then
echo "UYARI: Disk kullanımı $PARTITION üzerinde %${CURRENT_USAGE} ile eşiği aştı!"
# Buraya e-posta gönderme, SMS atma gibi uyarı mekanizmaları eklenebilir.
# Örneğin: echo "Mesajınız" | mail -s "Konu" admin@example.com
fi
7. Bash Betiklerinde Güvenlik ve En İyi Uygulamalar
Betiklerinizi yazarken aşağıdaki noktaları göz önünde bulundurmak, hem güvenliği artırır hem de bakımı kolaylaştırır:
- Sürekli Tırnak Kullanımı: Değişkenleri her zaman çift tırnak içine alın (`\"$VARIABLE\"`), boşluk içeren dosya adları gibi sorunları önler.
- Hata Kontrolü:
Kod:
set -e
Kod:set -u
Kod:set -o pipefail
Kod:#!/bin/bash set -euo pipefail # Betik içeriği
- Yorum Kullanımı: Betiğinizin ne yaptığını ve karmaşık kısımları açıklayın.
Kod:
# Bu bir yorumdur
- Fonksiyonları Kullanın: Tekrar eden kod bloklarını fonksiyonlara ayırın.
- Girdileri Doğrulayın: Kullanıcıdan veya başka bir kaynaktan gelen girdileri daima doğrulayın ve sanitize edin.
- Root Olarak Çalıştırmayın: Betikleri mümkün olduğunca düşük ayrıcalıklarla çalıştırın. Sudo kullanmanız gerekiyorsa, bunu betik içinde dikkatlice yönetin.
- Günlük Kaydı (Logging): Betiklerinizin çıktısını ve hatalarını bir log dosyasına yönlendirin.
- Yol Güvenliği: PATH ortam değişkenine güvenmeyin. Komutların tam yollarını belirtin (örn:
Kod:
/bin/ls
Kod:ls
"Bash, bir sistem yöneticisinin elindeki İsviçre çakısı gibidir. Ne kadar iyi kullanırsanız, o kadar çok sorunu çözebilir ve o kadar çok zaman kazanabilirsiniz."
Sonuç
Sistem yönetimi, sürekli değişen ve gelişen bir alandır. Bash, bu dinamik ortamda bir sistem yöneticisinin en güvenilir dostlarından biridir. Temel komutlardan karmaşık otomasyon betiklerine kadar sunduğu geniş yelpazedeki yetenekler sayesinde, günlük iş yükünüzü hafifletebilir, hataları en aza indirebilir ve sistemlerinizin sürekli çalışır durumda kalmasını sağlayabilirsiniz. Unutmayın, Bash'te ustalık pratikle gelir. Bu rehberde sunulan bilgileri ve örnekleri kendi sistemlerinizde deneyerek bilginizi pekiştirin ve yeni senaryolar üzerinde çalışarak kendinizi geliştirmeye devam edin. Bash öğrenmek, sadece bir araç öğrenmek değil, aynı zamanda sistemler üzerinde tam kontrol sahibi olmanın kapılarını aralamaktır.
Daha fazla kaynak için:
* Bash Referans Kılavuzu (İngilizce)
* Bash Scripting Intro (İngilizce)
* Bash - Vikipedi (Türkçe)
Umarım bu kapsamlı rehber, Bash konusundaki bilgi birikiminize değerli bir katkı sağlar ve sistem yönetimi görevlerinizde size yol gösterir. Başarılar!