SCP ve SFTP ile Güvenli Dosya Aktarımı

Dosya aktarımı, sistem yöneticilerinin günlük rutininin vazgeçilmez bir parçası. Sunucular arası yedek almak, konfigürasyon dosyalarını dağıtmak ya da uzak bir makineden log çekmek… Bunların hepsinde güvenli ve hızlı bir aktarım yöntemine ihtiyaç duyarsınız. İşte bu noktada SCP ve SFTP devreye giriyor. Her ikisi de SSH altyapısını kullandığı için şifreli, güvenli ve neredeyse her Linux sistemde hazır halde bulunuyor. Bu yazıda bu iki araçı derinlemesine inceleyeceğiz, aralarındaki farkları konuşacağız ve gerçek dünya senaryolarında nasıl kullanacağınızı göreceğiz.

SCP Nedir ve Nasıl Çalışır?

SCP, “Secure Copy Protocol” kelimelerinin kısaltması. Temel olarak SSH üzerinden dosya kopyalamak için tasarlanmış bir araç. Sözdizimi, klasik Unix cp komutuna çok benziyor; bu yüzden öğrenmesi oldukça kolay.

SCP’nin çalışma mantığı şu şekilde: İki makine arasında bir SSH tüneli açıyor ve dosyayı bu tünel üzerinden gönderiyor. Bu sayede transfer sırasında veriler şifreleniyor. Ancak şunu belirtmek gerekir: SCP, OpenSSH’nin son versiyonlarında artık “deprecated” yani kullanımdan kaldırılmış olarak işaretlendi. Yine de pratik dünyada hâlâ yaygın kullanılıyor ve öğrenmesi gereken bir araç olmaya devam ediyor.

Temel SCP Sözdizimi

scp [seçenekler] kaynak hedef

Uzak makineleri belirtirken kullanici@sunucu:/yol formatını kullanıyorsunuz. Hadi birkaç temel örnekle başlayalım.

Yerel’den uzağa dosya kopyalama:

# Tek bir dosyayı uzak sunucuya göndermek
scp /home/ahmet/rapor.pdf [email protected]:/var/www/html/docs/

# Belirli bir port üzerinden kopyalama (büyük P dikkat)
scp -P 2222 /etc/nginx/nginx.conf [email protected]:/tmp/

# Birden fazla dosyayı aynı anda göndermek
scp dosya1.txt dosya2.txt log.gz [email protected]:/home/admin/

Uzaktan yerele dosya çekme:

# Uzak sunucudan log dosyası çekmek
scp [email protected]:/var/log/nginx/error.log /tmp/nginx-error-$(date +%Y%m%d).log

# Tüm bir dizini recursive olarak indirmek
scp -r [email protected]:/var/backups/mysql/ /mnt/yedekler/

SCP’nin Önemli Parametreleri

  • -P port: Varsayılan 22 yerine farklı bir SSH portu belirtir
  • -r: Dizinleri recursive (özyinelemeli) olarak kopyalar
  • -p: Dosyanın izinlerini, zaman damgalarını ve erişim sürelerini korur
  • -C: Sıkıştırmayı etkinleştirir, yavaş bağlantılarda faydalıdır
  • -i kimlik_dosyası: Belirli bir SSH özel anahtarı kullanır
  • -l bant_genişliği: Transfer hızını Kbit/s cinsinden sınırlar
  • -v: Verbose mod, debug için kullanılır
  • -q: Sessiz mod, ilerleme çubuğunu ve uyarıları gizler
  • -o ssh_seçeneği: SSH seçeneklerini doğrudan geçirir

Gerçek Dünya Senaryosu: Nginx Yapılandırmasını Dağıtmak

Diyelim ki 5 web sunucunuz var ve hepsine güncellenmiş bir Nginx konfigürasyonu dağıtmanız gerekiyor. Elle tek tek bağlanmak yerine şöyle bir yaklaşım kullanabilirsiniz:

#!/bin/bash
# nginx-dagit.sh - Nginx konfigürasyonunu tüm sunuculara dağıt

SUNUCULAR=("web01.example.com" "web02.example.com" "web03.example.com" "web04.example.com" "web05.example.com")
KULLANICI="deploy"
KAYNAK="/etc/nginx/nginx.conf"
HEDEF="/tmp/nginx.conf.yeni"
SSH_ANAHTAR="/home/deploy/.ssh/id_ed25519"

for sunucu in "${SUNUCULAR[@]}"; do
    echo ">>> $sunucu adresine gönderiliyor..."
    scp -i "$SSH_ANAHTAR" -P 2222 "$KAYNAK" "${KULLANICI}@${sunucu}:${HEDEF}"
    
    if [ $? -eq 0 ]; then
        echo "[$sunucu] Başarılı"
        # Kopyaladıktan sonra yerleştir ve reload et
        ssh -i "$SSH_ANAHTAR" -p 2222 "${KULLANICI}@${sunucu}" 
            "sudo cp $HEDEF /etc/nginx/nginx.conf && sudo nginx -t && sudo systemctl reload nginx"
    else
        echo "[$sunucu] HATA: Dosya gönderilemedi!"
    fi
done

Bu script’i cron’a ekleyebilir ya da CI/CD pipeline’ınıza entegre edebilirsiniz.

SFTP Nedir ve Nasıl Çalışır?

SFTP, “SSH File Transfer Protocol” anlamına geliyor. SCP’den farklı olarak SFTP, tam anlamıyla bir dosya transfer protokolü sunuyor. Sadece kopyalama yapmıyor; uzak dosya sistemiyle etkileşime girmenizi sağlıyor. Dizin oluşturmak, dosya silmek, izinleri değiştirmek, dosya listesi almak… Bunların hepsini SFTP üzerinden yapabilirsiniz.

SCP, tek yönlü bir transfer aracı gibi düşünülebilirken SFTP, interaktif bir dosya yöneticisi gibi çalışıyor. Bu da onu özellikle karmaşık transfer senaryolarında çok daha güçlü kılıyor.

İnteraktif SFTP Kullanımı

# Bir sunucuya SFTP ile bağlanmak
sftp [email protected]

# Farklı port kullanarak bağlanmak
sftp -P 2222 [email protected]

# Özel SSH anahtarıyla bağlanmak
sftp -i ~/.ssh/id_ed25519 [email protected]

Bağlandıktan sonra karşınıza sftp> promptu çıkıyor. Buradan çeşitli komutlar kullanabilirsiniz:

  • ls: Uzak dizindeki dosyaları listeler
  • lls: Yerel dizindeki dosyaları listeler
  • pwd: Uzak sunucudaki mevcut dizini gösterir
  • lpwd: Yerel makinedeki mevcut dizini gösterir
  • cd dizin: Uzak sunucuda dizin değiştirir
  • lcd dizin: Yerel makinede dizin değiştirir
  • get dosya: Uzak dosyayı indirip yerel dizine kopyalar
  • put dosya: Yerel dosyayı uzak sunucuya yükler
  • mget *.log: Birden fazla dosyayı indirir (wildcard destekler)
  • mput *.conf: Birden fazla dosyayı yükler
  • mkdir dizin: Uzak sunucuda dizin oluşturur
  • rm dosya: Uzak sunucudaki dosyayı siler
  • chmod 644 dosya: Uzak dosyanın izinlerini değiştirir
  • rename eski yeni: Uzak dosyayı yeniden adlandırır
  • bye veya exit: Bağlantıyı kapatır

SFTP’de Batch Modu (Toplu İşlem)

SFTP’nin en güçlü özelliklerinden biri batch modunda çalışabilmesidir. Bu sayede script’lerle otomatize edilebilir.

# Batch dosyası oluştur: yukle-komutlar.txt
cat > /tmp/yukle-komutlar.txt << 'EOF'
cd /var/www/html
mkdir releases
cd releases
put /home/deploy/uygulama-v2.1.tar.gz
chmod 644 uygulama-v2.1.tar.gz
bye
EOF

# Batch modunda çalıştır
sftp -b /tmp/yukle-komutlar.txt [email protected]

Gerçek Dünya Senaryosu: Günlük Yedek İndirme

Bir veritabanı sunucunuzdan her gece yedekleri merkezi bir yedekleme sunucusuna çekmek istiyorsunuz. SFTP batch modu burada biçilmiş kaftan:

#!/bin/bash
# yedek-cek.sh - Günlük MySQL yedeklerini çek

TARIH=$(date +%Y%m%d)
DB_SUNUCU="db01.example.com"
DB_KULLANICI="backup-user"
SSH_ANAHTAR="/root/.ssh/backup_key"
YEREL_YEDEK_DIZIN="/mnt/nas/yedekler/mysql/${TARIH}"
UZAK_YEDEK_DIZIN="/var/backups/mysql"

# Yerel hedef dizini oluştur
mkdir -p "$YEREL_YEDEK_DIZIN"

# Batch komut dosyasını hazırla
BATCH_DOSYA=$(mktemp)
cat > "$BATCH_DOSYA" << EOF
lcd ${YEREL_YEDEK_DIZIN}
cd ${UZAK_YEDEK_DIZIN}
mget *${TARIH}*.sql.gz
bye
EOF

# SFTP ile yedekleri çek
sftp -b "$BATCH_DOSYA" -i "$SSH_ANAHTAR" "${DB_KULLANICI}@${DB_SUNUCU}"

CIKIS_KODU=$?

# Geçici dosyayı temizle
rm -f "$BATCH_DOSYA"

if [ $CIKIS_KODU -eq 0 ]; then
    echo "[$(date)] Yedekler başarıyla indirildi: $YEREL_YEDEK_DIZIN" >> /var/log/yedek-transfer.log
else
    echo "[$(date)] HATA: Yedek transferi başarısız!" >> /var/log/yedek-transfer.log
    # Bildirim gönder
    mail -s "KRITIK: Yedek transferi basarisiz" [email protected] < /dev/null
fi

Bu script’i cron’a eklemek için:

# Her gece 02:30'da çalıştır
30 2 * * * /usr/local/bin/yedek-cek.sh

SCP ve SFTP Arasındaki Temel Farklar

Her ikisi de SSH üzerinde çalıssa da aralarında önemli farklar var:

SCP hakkında bilmeniz gerekenler:

  • Tek seferlik, hızlı transferler için idealdir
  • Komut satırında daha sade ve basit kullanım sunar
  • Script’lerde tek satırda kullanmak çok kolaydır
  • Wildcard desteği sınırlıdır ve bazen beklenmedik davranışlar gösterir
  • Büyük dosyaları veya çok sayıda küçük dosyayı aktarırken SFTP’ye göre daha yavaş olabilir
  • OpenSSH 9.0 ile birlikte artık arka planda SFTP protokolü kullanıyor

SFTP hakkında bilmeniz gerekenler:

  • İnteraktif kullanım için çok daha uygundur
  • Dosya yönetimi yapabilirsiniz (oluşturma, silme, izin değiştirme)
  • Batch modunda tam otomasyon sağlar
  • Transfer durumu üzerinde daha fazla kontrol sunar
  • Bant genişliğini daha verimli kullanır
  • Hata durumlarında daha anlamlı mesajlar verir
  • Kesintiye uğramış transferleri yönetmek daha kolaydır

SSH Anahtar Tabanlı Kimlik Doğrulama Kurulumu

Hem SCP hem de SFTP’yi parolasız kullanabilmek için SSH anahtar çiftleri oluşturmanız gerekiyor. Özellikle otomasyon script’leri için bu zorunlu.

# Ed25519 algoritmasıyla yeni anahtar çifti oluştur (önerilen)
ssh-keygen -t ed25519 -C "backup-server-$(date +%Y%m%d)" -f ~/.ssh/backup_key

# Anahtarı hedef sunucuya kopyala
ssh-copy-id -i ~/.ssh/backup_key.pub -p 2222 [email protected]

# Bağlantıyı test et
ssh -i ~/.ssh/backup_key -p 2222 [email protected] "echo 'Bağlantı başarılı'"

# Artık SCP ile kullanabilirsiniz
scp -i ~/.ssh/backup_key dosya.txt [email protected]:/tmp/

~/.ssh/config dosyasını kullanarak daha da kolay hale getirebilirsiniz:

# ~/.ssh/config dosyasına ekle
cat >> ~/.ssh/config << 'EOF'
Host web-prod
    HostName 192.168.1.50
    User deploy
    Port 2222
    IdentityFile ~/.ssh/backup_key
    ServerAliveInterval 60

Host db-prod
    HostName 192.168.1.100
    User backup-user
    Port 22
    IdentityFile ~/.ssh/backup_key
    ServerAliveInterval 60
EOF

chmod 600 ~/.ssh/config

# Artık kısa isimle kullanabilirsiniz
scp rapor.pdf web-prod:/var/www/html/
sftp db-prod

Büyük Dosya Transferlerinde Performans İpuçları

Gigabyte’larca veri aktarırken doğru ayarları kullanmak ciddi zaman kazandırıyor.

# Sıkıştırma ile transfer (CPU'su iyi ama bant genişliği kısıtlı olan bağlantılar için)
scp -C -r /var/log/uygulama/ admin@uzak-sunucu:/tmp/loglar/

# Daha hızlı şifreleme algoritması seç (eski varsayılan AES yerine)
scp -o "[email protected]" buyuk-dosya.tar admin@uzak-sunucu:/tmp/

# Bant genişliği limitleme (üretim trafiğini boğmamak için)
# 5000 Kbps = yaklaşık 5 Mbps
scp -l 5000 veritabani-yedek.sql.gz admin@uzak-sunucu:/var/backups/

# Çok sayıda küçük dosya için önce arşivle, sonra aktar
tar czf - /var/www/html/ | ssh admin@uzak-sunucu "cat > /tmp/html-backup.tar.gz"

SSHFS ile Uzak Dizini Bağlamak

Dosya aktarımının ötesine geçmek istiyorsanız SSHFS harika bir araç. Uzak bir dizini yerel sisteminize mount ediyorsunuz ve dosyalara sanki yerel diskinizdeymiş gibi erişiyorsunuz. Altta SFTP protokolünü kullanıyor.

# SSHFS'i kur
sudo apt install sshfs   # Debian/Ubuntu
sudo dnf install fuse-sshfs  # RHEL/Fedora

# Mount noktasını oluştur
mkdir -p /mnt/uzak-sunucu

# Uzak dizini bağla
sshfs -o IdentityFile=~/.ssh/id_ed25519 
      -o ServerAliveInterval=30 
      -o reconnect 
      [email protected]:/var/www/html /mnt/uzak-sunucu

# Artık normal dosya komutlarıyla kullanabilirsiniz
ls -la /mnt/uzak-sunucu
cp yerel-dosya.txt /mnt/uzak-sunucu/

# Bağlantıyı kesmek için
fusermount -u /mnt/uzak-sunucu

Güvenlik Önerileri

SCP ve SFTP kullanırken güvenliği artırmak için birkaç önemli nokta:

  • Şifre yerine her zaman SSH anahtarı kullanın: Özellikle otomasyon script’lerinde şifre kullanmak hem güvensiz hem de pratikte imkânsız.
  • Ayrı bir SFTP kullanıcısı oluşturun: Backup ya da transfer işlemleri için tam SSH erişimi olan kullanıcı yerine kısıtlı bir SFTP kullanıcısı oluşturun.
  • chroot ile SFTP kullanıcısını kilitleyin: Kullanıcının sadece belirli bir dizine erişmesini sağlayın.
  • /etc/ssh/sshd_config dosyasına SFTP-only konfigürasyonu ekleyin:
# /etc/ssh/sshd_config dosyasına eklenecek SFTP-only kullanıcı kısıtlaması
Match User sftp-transfer
    ForceCommand internal-sftp
    PasswordAuthentication no
    ChrootDirectory /var/transfer
    PermitTunnel no
    AllowAgentForwarding no
    AllowTcpForwarding no
    X11Forwarding no

Bu konfigürasyon sayesinde sftp-transfer kullanıcısı sadece SFTP bağlantısı kurabilir, SSH shell’e erişemez ve /var/transfer dışına çıkamaz.

  • Transfer loglarını izleyin: /var/log/auth.log veya /var/log/secure dosyalarında SFTP bağlantılarını takip edin.
  • Fail2ban kullanın: Kaba kuvvet saldırılarına karşı SSH ve dolayısıyla SCP/SFTP erişimini koruyun.

Rsync ile Karşılaştırma: Ne Zaman Hangisini Kullanmalı?

Sık sorulan bir soru: “SCP mi kullanayım, rsync mi?” İkisi farklı problemleri çözmek için tasarlandı.

SCP’yi tercih edin:

  • Tek seferlik, basit dosya kopyalamaları için
  • Hızlıca bir dosyayı bir yerden bir yere taşımak istediğinizde
  • Rsync’in kurulu olmadığı sistemlerde

SFTP’yi tercih edin:

  • İnteraktif uzak dosya yönetimi için
  • Batch modunda karmaşık transfer senaryolarında
  • SFTP istemcilerini (FileZilla, WinSCP gibi) destekleyen iş akışlarında

Rsync’i tercih edin:

  • Büyük dizin ağaçlarını senkronize etmek için
  • Delta transfer özelliği sayesinde sadece değişen dosyaları göndermek istediğinizde
  • Düzenli yedekleme ve senkronizasyon görevleri için

Sonuç

SCP ve SFTP, Linux sistem yöneticisinin araç kutusundaki temel parçalar. SCP, sadeliği ve kolaylığıyla hızlı işler için mükemmel; SFTP ise güçlü dosya yönetimi ve otomasyon özellikleriyle daha karmaşık senaryolara cevap veriyor.

Pratikte her ikisini de öğrenmek ve hangisinin nerede daha uygun olduğunu bilmek önemli. Tek seferlik bir dosya gönderiyorsanız SCP yeterli, düzenli otomatik transfer script’leri yazıyorsanız SFTP’nin batch modunu veya rsync’i tercih edin.

SSH anahtar tabanlı kimlik doğrulamayı mutlaka kurun, SFTP kullanıcılarını chroot ile kısıtlayın ve transfer işlemlerini loglardan takip edin. Bu üç temel güvenlik pratiğini hayata geçirirseniz, dosya aktarımlarınız hem güvenli hem de yönetilebilir olacaktır.

Sorularınız ya da eklemek istediğiniz senaryolar varsa yorumlarda buluşalım.

Yorum yapın