cmp Komutu: İkili Dosya Karşılaştırma Rehberi
Web sunucusu yönetiminde en sık karşılaştığım durumlardan biri şu: İki sunucu arasında bir dosyanın gerçekten aynı olup olmadığını doğrulamam gerekiyor. diff komutu metin dosyaları için harika çalışıyor ama binary dosyalarda, derlenmiş uygulamalarda veya konfigürasyon dosyalarının tam bit karşılaştırmasında işler biraz farklı. İşte tam bu noktada cmp komutu devreye giriyor.
Bu yazıda cmp komutunu web sunucusu yönetimi perspektifinden ele alacağız. Nginx binary’lerini karşılaştırmaktan SSL sertifikalarını doğrulamaya, deployment kontrolünden backup doğrulamaya kadar gerçek dünya senaryolarıyla konuyu işleyeceğiz.
cmp Nedir ve Neden Kullanmalısınız?
cmp (compare), iki dosyayı byte byte karşılaştıran bir Unix aracıdır. diff komutundan temel farkı şudur: diff metin odaklı çalışır ve satır bazlı karşılaştırma yapar, cmp ise her türlü dosyayı ham byte düzeyinde karşılaştırır.
Web sunucusu yönetiminde bu ayrım kritik öneme sahip:
- Binary dosyalar: Nginx, Apache, PHP binary’leri
- Sıkıştırılmış dosyalar: .tar.gz, .zip paketleri
- SSL/TLS sertifikaları ve anahtar dosyaları
- Statik web varlıkları: Minify edilmiş JS/CSS dosyaları
- Veritabanı dump dosyaları
- Docker image katmanları
diff bu dosyalara baktığında ya hata verir ya da anlamsız çıktı üretir. cmp ise sizi asla yanıltmaz.
Temel Kullanım
Basit Karşılaştırma
cmp dosya1 dosya2
Eğer dosyalar aynıysa hiçbir çıktı üretmez ve exit code 0 döner. Farklıysa ilk farklı byte’ın konumunu bildirir:
cmp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
# Çıktı: /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup differ: byte 1024, line 45
Bu basit çıktı bile çok değerli bilgi içeriyor: Hangi byte ve hangi satırda fark başlıyor.
Önemli Seçenekler
cmp komutunun temel bayraklarını bilmek işinizi çok kolaylaştırır:
-l(–verbose): Farklı olan tüm byte’ları listeler-s(–quiet): Sessiz mod, sadece exit code döner-n NUM: Sadece ilk NUM byte’ı karşılaştırır-i NUM: Baştan NUM byte atlanarak karşılaştırılır-b: Farklı byte’ları yazdırılabilir karakter olarak gösterir
Gerçek Dünya Senaryoları
Senaryo 1: Deployment Doğrulama
Production sunucusuna yeni bir Nginx binary deploy ettiniz. Peki bu binary gerçekten doğru versiyon mu? MD5 hash kontrolü yerine doğrudan binary karşılaştırması yapabilirsiniz:
#!/bin/bash
# deploy-check.sh - Deployment sonrasi binary dogrulama
STAGING_BINARY="/tmp/nginx-new"
PROD_BINARY="/usr/sbin/nginx"
REFERENCE_BINARY="/opt/binaries/nginx-1.24.0-reference"
echo "=== Nginx Binary Karsilastirma ==="
# Staging ile reference karsilastir
if cmp -s "$STAGING_BINARY" "$REFERENCE_BINARY"; then
echo "[OK] Staging binary referans ile eslesıyor"
else
echo "[HATA] Staging binary referans ile eslesmıyor!"
# Farkli byte sayisini bul
DIFF_COUNT=$(cmp -l "$STAGING_BINARY" "$REFERENCE_BINARY" 2>/dev/null | wc -l)
echo "[BILGI] Toplam $DIFF_COUNT byte farki tespit edildi"
exit 1
fi
# Production'a kopyalandiktan sonra tekrar dogrula
if cmp -s "$PROD_BINARY" "$REFERENCE_BINARY"; then
echo "[OK] Production binary basariyla deploy edildi"
else
echo "[KRITIK] Production binary tutarsiz! Rollback gerekiyor!"
exit 2
fi
echo "Deployment dogrulama tamamlandi."
Bu script deployment pipeline’ınıza kolayca entegre edilebilir. Exit code kontrolü sayesinde CI/CD sistemleriniz hataları otomatik yakalayabilir.
Senaryo 2: SSL Sertifika ve Anahtar Eşleşme Kontrolü
Web sunucusu yönetiminde en sinir bozucu hatalardan biri şudur: SSL sertifikası ile private key birbirine uymuyor. Bu durumu cmp ile dolaylı olarak kontrol edebilirsiniz. Daha da iyi bir yaklaşım ise sertifika ve anahtarın modulus değerlerini karşılaştırmaktır:
#!/bin/bash
# ssl-check.sh - SSL sertifika ve anahtar uyum kontrolu
CERT_FILE="/etc/nginx/ssl/domain.crt"
KEY_FILE="/etc/nginx/ssl/domain.key"
BACKUP_CERT="/backup/ssl/domain.crt"
BACKUP_KEY="/backup/ssl/domain.key"
echo "=== SSL Dosyasi Karsilastirma ==="
# Mevcut sertifikayi backup ile karsilastir
if cmp -s "$CERT_FILE" "$BACKUP_CERT"; then
echo "[OK] Sertifika backup ile ayni"
else
echo "[UYARI] Sertifika degismis, yenilenme tarihi kontrol edilmeli"
# Sadece ilk 100 byte'i karsilastir (header kontrolu)
echo "Header karsilastirmasi:"
cmp -n 100 "$CERT_FILE" "$BACKUP_CERT" 2>&1
fi
# Private key backup ile karsilastir
# DIKKAT: Bu islem sadece guvenli ortamda yapilmali!
if cmp -s "$KEY_FILE" "$BACKUP_KEY"; then
echo "[OK] Private key backup ile ayni"
else
echo "[KRITIK] Private key degismis! Acil inceleme gerekli!"
exit 1
fi
Önemli not: Private key dosyalarını karşılaştırırken bu işlemin güvenli bir ortamda yapıldığından emin olun. Key dosyalarını asla network üzerinden düz metin olarak taşımayın.
Senaryo 3: Web Varlıklarının CDN Doğrulaması
Statik dosyalarınızı CDN’e yüklediniz. Peki CDN’deki dosyalar gerçekten doğru mu? Özellikle minify edilmiş JavaScript ve CSS dosyaları için bu kontrol kritiktir:
#!/bin/bash
# cdn-verify.sh - CDN uzerindeki dosyalari yerel kopya ile dogrula
LOCAL_ASSETS="/var/www/html/assets"
CDN_CACHE="/tmp/cdn-cache"
FAILED_FILES=0
CHECKED_FILES=0
# CDN'den dosyalari indir ve karsilastir
echo "=== CDN Dosya Dogrulama Baslıyor ==="
for local_file in "$LOCAL_ASSETS"/*.{js,css,woff2,png,jpg}; do
[ -f "$local_file" ] || continue
filename=$(basename "$local_file")
cdn_file="$CDN_CACHE/$filename"
# CDN'den dosyayi indir (wget veya curl ile)
wget -q "https://cdn.siteniz.com/assets/$filename" -O "$cdn_file" 2>/dev/null
if [ ! -f "$cdn_file" ]; then
echo "[EKSIK] $filename CDN'de bulunamadi"
((FAILED_FILES++))
continue
fi
if cmp -s "$local_file" "$cdn_file"; then
echo "[OK] $filename eslesiyor"
else
echo "[HATA] $filename CDN'de farkli!"
# Fark detaylarini goster
LOCAL_SIZE=$(stat -c%s "$local_file")
CDN_SIZE=$(stat -c%s "$cdn_file")
echo " Yerel boyut: $LOCAL_SIZE bytes, CDN boyut: $CDN_SIZE bytes"
((FAILED_FILES++))
fi
((CHECKED_FILES++))
done
echo ""
echo "=== Sonuc ==="
echo "Kontrol edilen: $CHECKED_FILES dosya"
echo "Hata: $FAILED_FILES dosya"
[ $FAILED_FILES -eq 0 ] && exit 0 || exit 1
Senaryo 4: Çoklu Sunucu Konfigürasyon Senkronizasyonu
Load balancer arkasında 5 web sunucunuz var ve hepsinin aynı konfigürasyona sahip olması gerekiyor. Bu senaryoda cmp ile hızlı bir kontrol yapabilirsiniz:
#!/bin/bash
# multi-server-sync-check.sh
# Tum sunucularda nginx.conf esitligini kontrol eder
MASTER_SERVER="web01"
SERVERS=("web02" "web03" "web04" "web05")
CONFIG_PATH="/etc/nginx/nginx.conf"
TEMP_DIR="/tmp/config-check"
MASTER_CONFIG="$TEMP_DIR/nginx.conf.master"
mkdir -p "$TEMP_DIR"
# Master sunucudan konfig al
echo "Master sunucudan ($MASTER_SERVER) konfig alınıyor..."
scp -q "$MASTER_SERVER:$CONFIG_PATH" "$MASTER_CONFIG"
if [ $? -ne 0 ]; then
echo "[HATA] Master sunucuya baglanılamadı!"
exit 1
fi
echo "=== Konfigürasyon Esitlik Kontrolu ==="
ALL_OK=true
for server in "${SERVERS[@]}"; do
REMOTE_CONFIG="$TEMP_DIR/nginx.conf.$server"
# Uzak sunucudan konfig al
scp -q "$server:$CONFIG_PATH" "$REMOTE_CONFIG" 2>/dev/null
if [ $? -ne 0 ]; then
echo "[UYARI] $server sunucusuna baglanılamadı, atlaniyor"
continue
fi
if cmp -s "$MASTER_CONFIG" "$REMOTE_CONFIG"; then
echo "[OK] $server - Master ile esit"
else
echo "[FARK] $server - Master ile FARKLI!"
# Hangi byte'da farklilastigini goster
FIRST_DIFF=$(cmp "$MASTER_CONFIG" "$REMOTE_CONFIG" 2>&1)
echo " İlk fark: $FIRST_DIFF"
ALL_OK=false
fi
rm -f "$REMOTE_CONFIG"
done
rm -f "$MASTER_CONFIG"
rmdir "$TEMP_DIR" 2>/dev/null
echo ""
if $ALL_OK; then
echo "Tum sunucular senkronize durumda."
exit 0
else
echo "Senkronizasyon sorunu tespit edildi!"
exit 1
fi
İleri Düzey Kullanım
Byte Offset ile Kısmi Karşılaştırma
Bazen bir dosyanın sadece belirli bir bölümünü karşılaştırmanız gerekir. Örneğin bir binary’nin sadece header kısmını kontrol etmek istiyorsunuz:
# İlk 512 byte'ı karsilastir (MBR veya dosya header kontrolu)
cmp -n 512 dosya1.bin dosya2.bin
# Belirli bir offsetten baslayarak karsilastir
# dosya1'i 100. byte'tan, dosya2'yi 200. byte'tan baslayarak karsilastir
cmp -i 100:200 dosya1 dosya2
# Tum farkli byte'lari listele ve say
cmp -l dosya1 dosya2 | wc -l
# Farkli byte'larin detaylarini goster
cmp -lb dosya1 dosya2 | head -20
Pipe ile Kullanım
cmp stdin’den de okuyabilir. Bu özellik özellikle network üzerinden dosya kontrolü yaparken çok işe yarıyor:
# Uzak dosyayi indirmeden karsilastir
ssh web02 "cat /etc/nginx/nginx.conf" | cmp /etc/nginx/nginx.conf -
# gzip ile sikistirilmis bir dosyanin icerigini karsilastir
zcat backup.sql.gz | cmp - current.sql
# Hash ile birlikte kullanım
md5sum dosya1 dosya2
# Vs
cmp -s dosya1 dosya2 && echo "Aynı" || echo "Farklı"
cmp vs Diğer Araçlar
Hangi durumda hangisini kullanmalısınız?
cmp: Binary dosyalar, hızlı eşit/farklı kontrolü, byte düzeyinde detay gerektiğindediff: Metin dosyaları, ne değişti görmek istediğinizde, patch üretmek içinmd5sum/sha256sum: Çok sayıda dosyayı hızlıca karşılaştırmak için, integrity kontrolü içinrsync --checksum: Dizinleri senkronize etmek ve farklılıkları bulmak için
Web sunucusu yönetiminde bu araçları birlikte kullanmak en verimli yaklaşımdır. Örneğin önce md5sum ile hızlı tarama yapıp, farklı bulunan dosyalarda cmp -l ile detaylı analiz yapabilirsiniz.
Exit Code’ları Anlama
cmp komutunun döndürdüğü exit code’ları script yazmada kritik öneme sahiptir:
- 0: Dosyalar aynı
- 1: Dosyalar farklı
- 2: Hata oluştu (dosya bulunamadı, erişim engeli vb.)
cmp -s dosya1 dosya2
RESULT=$?
case $RESULT in
0) echo "Dosyalar identik" ;;
1) echo "Dosyalar farklı" ;;
2) echo "Karşılaştırma hatası" ;;
esac
-s (silent) bayrağı ile birlikte bu pattern, script’lerinizde temiz ve güvenilir kontroller yapmanızı sağlar.
Pratik İpuçları
- Büyük dosyalarda dikkatli olun:
cmp -lile büyük binary dosyaları karşılaştırırsanız çok fazla çıktı üretebilir. Çıktıyıheadveyawc -lile sınırlandırın. - Symbolic link’ler:
cmpsymlink’lerin işaret ettiği dosyaları karşılaştırır, symlink’lerin kendisini değil. Bu genellikle istediğiniz davranıştır ama bilinmesi gerekir. - İzin sorunları:
cmpokuma iznine ihtiyaç duyar. Root ya da ilgili kullanıcı ile çalıştırın. - Cron job’larda kullanım:
-sbayrağını her zaman kullanın, gereksiz mail/log çıktısından kaçının. - Paralel kontrol: Çok sayıda dosyayı kontrol ederken
xargs -Pile paralel çalıştırarak süreci hızlandırabilirsiniz.
Sonuç
cmp komutu, web sunucusu yönetiminde göründüğünden çok daha fazla işe yarayan güçlü bir araçtır. Deployment doğrulamasından CDN kontrolüne, çoklu sunucu senkronizasyonundan SSL sertifika yönetimine kadar geniş bir kullanım alanına sahiptir.
En büyük avantajı şudur: Sizi yanıltmaz. Byte 0’dan başlayarak bit bit karşılaştırma yapar ve iki dosyanın gerçekten aynı olup olmadığını kesin olarak söyler. Metin editörlerinin gizleyebileceği boşluk karakterleri, satır sonu farklılıkları veya encoding sorunları cmp önünde gizlenemez.
Script’lerinizde cmp -s ile sessiz karşılaştırma yapın, exit code’lara göre aksiyonunuzu belirleyin. Bu basit pattern, çok sayıda production sorununu başlamadan önce engellemenizi sağlayacaktır.
Bir sonraki deployment’ınızda veya sunucu senkronizasyonunuzda cmp komutunu kullanmayı deneyin. Küçük bir araç, büyük güven verir.
