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_configdosyası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.logveya/var/log/securedosyaları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.