scp ve rsync ile Dosya Transferi Neden Hâlâ Gerekli?
Linux sunucularıyla çalışırken, er ya da geç dosyaları farklı makineler arasında taşımanız gereken bir noktaya gelirsiniz. Veritabanı yedeğini üretim sunucusundan güvenli bir hedefe taşımak veya uygulama günlüklerini analiz için başka bir sunucuya göndermek isteyebilirsiniz. Bu durumlarda FTP gibi grafiksel araçlar yalnızca yeterli güvenliği sağlamakla kalmaz, aynı zamanda büyük ve sık transferler için çok yavaş ve verimsizdir.
İşte burada scp ve rsync devreye girer. Bu iki komut satırı aracı, Linux dünyasında dosya transferinin gerçek standardıdır. scp, basit ve hızlı transferler için mükemmeldir; rsync ise artımlı senkronizasyon ve kesintiye uğramış transferi sürdürme özelliğiyle yedekleme ve büyük veri transferleri için ilk tercihtir. Bu makalede, her iki aracı da pratik örneklerle inceleyeceğiz ve resmi belgelerde nadiren değinilen önemli noktaları ele alacağız.
scp ile Tanışın; Basit ve Güvenli Transfer
scp (Secure Copy) komutu, dosya transferi için SSH protokolünü kullanır. Yani tüm veriler şifrelenir ve kimlik doğrulamanız SSH anahtarı veya parola ile yapılır. Temel sözdizimi şu şekildedir:
scp [seçenekler] kaynak hedef
Örneğin, backup.sql dosyasını yerel sunucudan 203.0.113.10 adresindeki hedef sunucudaki /var/backups/ dizinine taşımak istiyorsanız:
scp backup.sql root@203.0.113.10:/var/backups/
Bu komutta root kullanıcı adı ve 203.0.113.10 sunucunun IP adresidir. SSH portunuz standart değilse (örneğin 2222), -P seçeneğini kullanın:
scp -P 2222 backup.sql root@203.0.113.10:/var/backups/
Tüm dizini özyinelemeli olarak taşımak için -r seçeneğini ekleyin:
scp -r /var/www/html/ root@203.0.113.10:/var/www/
Bilmeniz Gereken scp Sınırlamaları
scp basit bir araçtır, ancak gerçek projelerde can sıkıcı olabilecek üç önemli sınırlaması vardır:
- Artımlı transfer desteği yok: Bir dosyayı daha önce aktardıysanız ve yalnızca birkaç megabayt değiştiyse, scp dosyanın tamamını yeniden gönderir.
- Transferin kesilmesi: Ağ bağlantısı ortasında koparsa, tüm süreci baştan başlatmanız gerekir.
- Dosya özniteliklerinin tam olarak korunmaması: Bazı durumlarda, dosyaların sahipliği ve değiştirilme zamanı doğru şekilde korunmaz.
Bu sınırlamalar tam olarak rsync'in devreye girdiği yerdir.
rsync; Akıllı Senkronizasyon ve Kesintiye Uğramış Transferin Devamı
rsync, farklılıkları tespit etmek için akıllı bir algoritmaya sahip bir dosya senkronizasyon aracıdır. Dosyanın tamamını göndermek yerine yalnızca değişen bölümleri aktarır. Bu özellik, büyük dosyaların (veritabanı dosyaları veya videolar gibi) aktarılması için büyük bir avantajdır.
rsync'in temel sözdizimi scp'den biraz farklıdır:
rsync [seçenekler] kaynak hedef
Dosya transferi için basit bir örnek:
rsync -avz backup.sql root@203.0.113.10:/var/backups/
-a (archive) seçeneği, sahiplik, değiştirilme zamanı, sembolik bağlantılar ve özyinelemeli transferi içeren arşiv modunu etkinleştirir. -v (verbose) işlem ayrıntılarını gösterir ve -z aktarım sırasında veri sıkıştırmayı etkinleştirir.
Artımlı Senkronizasyon; Zaman ve Bant Genişliği Tasarrufu
50 GB veri içeren bir dizininiz olduğunu ve her gece hedef sunucuyla senkronize etmeniz gerektiğini varsayalım. scp ile her seferinde 50 GB gönderilir. Ancak rsync ile yalnızca 200 MB değiştiyse, yalnızca o 200 MB aktarılır. Bu, aşağıdaki komutla yapılır:
rsync -avz --delete /var/www/html/ root@203.0.113.10:/var/www/html/
--delete seçeneği, kaynakta silinen dosyaları hedeften de siler. Bu seçenek tam senkronizasyon için gereklidir, ancak yalnızca dosya eklemek veya güncellemek istiyorsanız kullanmayın.
rsync ile Kesintiye Uğramış Transferin Devamı
rsync'in en önemli özelliklerinden biri, transferi kaldığı yerden sürdürebilme yeteneğidir. 10 GB'lık bir dosyayı aktarırken bağlantınız koparsa, aynı komutu yeniden çalıştırdığınızda rsync kaldığı yerden devam eder. Bunun için --partial seçeneğini kullanın:
rsync -avz --partial --progress bigfile.iso root@203.0.113.10:/var/tmp/
--partial seçeneği, rsync'in eksik dosyayı hedefte tutmasına ve bir sonraki çalıştırmada aynı noktadan devam etmesine izin verir. --progress seçeneği de ilerleme yüzdesini gösterir.
Uçtan Uca Transfer ve Bant Genişliği Sınırlaması
rsync, veriler makinenizden geçmeden iki uzak sunucu arasında dosya aktarabilir:
rsync -avz root@192.0.2.10:/var/www/ root@198.51.100.20:/var/www/
Bant genişliğiniz sınırlıysa, --bwlimit seçeneğiyle maksimum aktarım hızını belirleyebilirsiniz. Örneğin, saniyede 5 megabayt ile sınırlamak için:
rsync -avz --bwlimit=5120 /data/ root@203.0.113.10:/data/
5120 değeri saniyede kilobayt cinsindendir (yani 5 megabayt). Bu, bant genişliğinin doygunluğunu ve diğer hizmetlerin kesintiye uğramasını önler.
Pratik scp ve rsync Karşılaştırması; Hangisini Seçmelisiniz?
Bu iki araç arasındaki seçim ihtiyacınıza bağlıdır. Aşağıdaki tablo hızlı bir rehberdir:
- Birkaç küçük dosyanın tek seferlik transferi: scp daha basit ve hızlıdır.
- Periyodik yedekleme ve senkronizasyon: rsync, artımlı transfer ile akıllıca bir seçimdir.
- Kararsız bağlantı üzerinden büyük dosya transferi: rsync,
--partialile tek mantıklı seçenektir. - Dosya izinlerinin ve sahipliğinin tam olarak korunması: rsync,
-aseçeneğiyle tamamen üstündür. - Özel ayar gerektirmeyen hızlı transfer: scp yeterlidir.
Yaygın Hatalar ve Çözümleri
Bu araçlarla çalışırken, önceden bilmenizde fayda olan birkaç yaygın hata vardır.
scp ve rsync'te Permission denied Hatası
Bu hata genellikle iki nedenden dolayı oluşur: ya parola yanlıştır ya da hedef kullanıcının hedef dizine yazma izni yoktur. İkinci sorunu çözmek için önce SSH ile sunucuya giriş yapın ve dizin iznini kontrol edin:
ls -ld /var/backups/
chown root:root /var/backups/
chmod 755 /var/backups/
Root olmayan bir kullanıcı kullanıyorsanız, kullanıcının hedef dizine erişimi olduğundan emin olun.
rsync ile Dosya Sahipliğini Koruma Sorunu
-a kullanırken chown failed hatası alıyorsanız, kullanıcınızın hedefte dosya sahipliğini değiştirme izni olmadığı anlamına gelir. Bu sorun genellikle root olmayan bir kullanıcı kullandığınızda ortaya çıkar. Çözüm, root kullanıcısını kullanmak veya sahipliğin kaynaktan kopyalanmaması için komuta --no-owner seçeneğini eklemektir:
rsync -avz --no-owner /data/ user@203.0.113.10:/data/
rsync ile Sık Sık Kesilen Transfer
Bağlantınız kararsızsa, aşağıdaki seçeneklerin kombinasyonunu deneyin:
rsync -avz --partial --progress --timeout=60 /data/ root@203.0.113.10:/data/
--timeout=60 seçeneği, 60 saniye boyunca hiç veri alışverişi olmazsa bağlantının kapanmasını ve rsync'in hata vermesini sağlar. Ardından, transfer tamamlanana kadar komutu bir döngü içinde çalıştırabilirsiniz:
until rsync -avz --partial --progress /data/ root@203.0.113.10:/data/; do echo "Yeniden deneniyor..."; sleep 5; done
Bu basit betik, komutu tamamen başarılı olana kadar tekrarlar.
Dosya Transferinde Önemli Güvenlik İpuçları
Her iki araç da SSH kullansa da, birkaç güvenlik noktasını unutmamalısınız:
- Parola yerine SSH anahtarı kullanın. Bu hem daha güvenlidir hem de otomasyon imkânı sağlar.
- Yan kanal saldırılarından endişeleniyorsanız, hassas dosyaları asla
-zseçeneğiyle sıkıştırmayın. Sıkıştırma, dosya içeriği hakkında bilgi sızdırabilir. - Çok hassas dosyaların transferi için
-e "ssh -c aes256-gcm@openssh.com"seçeneğini kullanın daha güçlü bir şifreleme algoritması uygulamak için. - Kullanıcı erişimini sınırlayın. Yalnızca dosya transferine ihtiyacınız varsa, rsync'i sınırlı izinlerle daemon modunda kullanabilirsiniz, ancak çoğu durumda normal SSH yeterlidir.
Özet ve Son Öneri
scp ve rsync ile dosya transferi, her sunucu yöneticisi için temel iki beceridir. scp hızlı ve basit işler için mükemmeldir, ancak düzenli yedekleme, büyük dizinlerin senkronizasyonu ve kararsız bağlantılar üzerinden dosya transferi için rsync rakipsizdir. Önerim, her iki aracı da araç kutunuzda bulundurmanız ve koşullara göre birini seçmenizdir.
Bu araçların iyi çalıştığı bir altyapı arıyorsanız, ServerNet'in bulut sunucu ve dedicated sunucu hizmetleri, uygun bant genişliği ve ağ kararlılığı ile bu transferleri gerçekleştirmek için uygun bir seçenektir. Ancak altyapı seçiminden bağımsız olarak, bu iki araca hâkim olmak işinizin kalitesini önemli ölçüde artıracaktır.
Son olarak, bu komutları bir test ortamında denemenizi öneririm. Birkaç GB'lık bir dosya oluşturun, scp ile aktarın ve ardından rsync ile senkronize edin. Bu iki aracın gerçek koşullardaki hız ve davranış farkı en iyi ders olacaktır.