cmp Komutu ile İkili Dosya Karşılaştırma Rehberi

cmp komutu, Linux sistemlerde iki dosyayı byte düzeyinde karşılaştırmak için kullanılan güçlü bir araçtır. Sunucu ortamlarında yapılandırma dosyalarını ve ikili dosyaları doğrulamak için sıklıkla tercih edilir. Bu rehberde cmp komutunun tüm seçeneklerini ve gerçek dünya kullanım senaryolarını ele alıyoruz.

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ğinde
  • diff: Metin dosyaları, ne değişti görmek istediğinizde, patch üretmek için
  • md5sum / sha256sum: Çok sayıda dosyayı hızlıca karşılaştırmak için, integrity kontrolü için
  • rsync --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 -l ile büyük binary dosyaları karşılaştırırsanız çok fazla çıktı üretebilir. Çıktıyı head veya wc -l ile sınırlandırın.
  • Symbolic link’ler: cmp symlink’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ı: cmp okuma iznine ihtiyaç duyar. Root ya da ilgili kullanıcı ile çalıştırın.
  • Cron job’larda kullanım: -s bayrağını her zaman kullanın, gereksiz mail/log çıktısından kaçının.
  • Paralel kontrol: Çok sayıda dosyayı kontrol ederken xargs -P ile 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir