انتقال فایل با scp و rsync؛ راهنمای عملی برای سرور

در این مقاله با دو ابزار قدرتمند انتقال فایل با scp و rsync آشنا می‌شوید؛ از دستورات پایه تا همگام‌سازی افزایشی، ادامه انتقال قطع‌شده و رفع خطاهای رایج.

۷ دقیقه به‌روزرسانی ۵ شهریور ۱۴۰۵

چرا انتقال فایل با scp و rsync هنوز ضروری است؟

وقتی با سرورهای لینوکسی کار می‌کنید، دیر یا زود به نقطه‌ای می‌رسید که باید فایل‌ها را بین ماشین‌های مختلف جابه‌جا کنید. شاید بخواهید بکاپ دیتابیس را از سرور تولید به مقصدی امن منتقل کنید، یا لاگ‌های اپلیکیشن را برای تحلیل به سرور دیگری بفرستید. در این شرایط، ابزارهای گرافیکی مثل FTP نه تنها امنیت کافی ندارند، بلکه برای انتقال‌های حجیم و مکرر بسیار کند و ناکارآمدند.

اینجاست که scp و rsync وارد می‌شوند. این دو ابزار خط فرمانی، استاندارد واقعی انتقال فایل در دنیای لینوکس هستند. scp برای انتقال‌های ساده و سریع عالی است، در حالی که rsync با قابلیت همگام‌سازی افزایشی و ادامه انتقال قطع‌شده، انتخاب اول برای بکاپ‌گیری و انتقال داده‌های حجیم محسوب می‌شود. در این مقاله، هر دو ابزار را با مثال‌های عملی بررسی می‌کنیم و نکات مهمی را که در مستندات رسمی کمتر به آن‌ها اشاره می‌شود، پوشش می‌دهیم.

آشنایی با scp؛ انتقال ساده و امن

دستور scp (Secure Copy) از پروتکل SSH برای انتقال فایل استفاده می‌کند. یعنی تمام داده‌ها رمزنگاری شده و احراز هویت شما هم از طریق کلید SSH یا پسورد انجام می‌شود. سینتکس پایه آن به این شکل است:

scp [options] source destination

برای مثال، اگر بخواهید فایل backup.sql را از سرور محلی به دایرکتوری /var/backups/ روی سرور مقصد با آدرس 203.0.113.10 منتقل کنید:

scp backup.sql root@203.0.113.10:/var/backups/

در این دستور، root نام کاربری و 203.0.113.10 آدرس IP سرور است. اگر پورت SSH شما غیراستاندارد است (مثلاً 2222)، از گزینه -P استفاده کنید:

scp -P 2222 backup.sql root@203.0.113.10:/var/backups/

برای انتقال کل دایرکتوری به صورت بازگشتی، گزینه -r را اضافه کنید:

scp -r /var/www/html/ root@203.0.113.10:/var/www/

محدودیت‌های scp که باید بدانید

scp ابزار ساده‌ای است، اما سه محدودیت مهم دارد که در پروژه‌های واقعی آزاردهنده می‌شوند:

  • عدم پشتیبانی از انتقال افزایشی: اگر فایلی را قبلاً منتقل کرده باشید و فقط چند مگابایت تغییر کرده باشد، scp کل فایل را دوباره می‌فرستد.
  • قطع شدن انتقال: اگر اتصال شبکه در میانه راه قطع شود، باید کل فرآیند را از ابتدا شروع کنید.
  • عدم حفظ کامل ویژگی‌های فایل: در برخی حالت‌ها، مالکیت و زمان تغییر فایل‌ها به درستی حفظ نمی‌شود.

این محدودیت‌ها دقیقاً همان جایی است که rsync وارد می‌شود.

rsync؛ همگام‌سازی هوشمند و ادامه انتقال قطع‌شده

rsync یک ابزار همگام‌سازی فایل است که الگوریتمی هوشمند برای تشخیص تفاوت‌ها دارد. به جای ارسال کل فایل، فقط بخش‌های تغییر یافته را منتقل می‌کند. این ویژگی برای انتقال فایل‌های حجیم (مثل فایل‌های دیتابیس یا ویدیو) یک مزیت بزرگ است.

سینتکس پایه rsync کمی با scp تفاوت دارد:

rsync [options] source destination

مثال ساده برای انتقال فایل:

rsync -avz backup.sql root@203.0.113.10:/var/backups/

گزینه‌های -a (archive) حالت بایگانی را فعال می‌کند که شامل حفظ مالکیت، زمان تغییر، لینک‌های سمبلیک و انتقال بازگشتی است. -v (verbose) جزئیات عملیات را نمایش می‌دهد و -z فشرده‌سازی داده‌ها را در حین انتقال فعال می‌کند.

همگام‌سازی افزایشی؛ صرفه‌جویی در زمان و پهنای باند

فرض کنید یک دایرکتوری با ۵۰ گیگابایت داده دارید و هر شب باید آن را با سرور مقصد همگام کنید. با scp، هر بار ۵۰ گیگابایت ارسال می‌شود. اما با rsync، اگر فقط ۲۰۰ مگابایت تغییر کرده باشد، فقط همان ۲۰۰ مگابایت منتقل می‌شود. این کار با دستور زیر انجام می‌شود:

rsync -avz --delete /var/www/html/ root@203.0.113.10:/var/www/html/

گزینه --delete فایل‌هایی را که در مبدأ حذف شده‌اند، از مقصد هم حذف می‌کند. این گزینه برای همگام‌سازی کامل ضروری است، اما اگر فقط می‌خواهید فایل‌ها را اضافه یا به‌روزرسانی کنید، از آن استفاده نکنید.

ادامه انتقال قطع‌شده با rsync

یکی از مهم‌ترین ویژگی‌های rsync، قابلیت ادامه انتقال از نقطه قطع است. اگر اتصال شما در حین انتقال یک فایل ۱۰ گیگابایتی قطع شود، با اجرای مجدد همان دستور، rsync از همان جایی که متوقف شده ادامه می‌دهد. برای این کار از گزینه --partial استفاده کنید:

rsync -avz --partial --progress bigfile.iso root@203.0.113.10:/var/tmp/

گزینه --partial به rsync اجازه می‌دهد فایل ناقص را در مقصد نگه دارد و در اجرای بعدی از همان نقطه ادامه دهد. گزینه --progress هم درصد پیشرفت را نمایش می‌دهد.

انتقال از راه دور به راه دور و محدودیت پهنای باند

rsync می‌تواند فایل‌ها را بین دو سرور راه دور منتقل کند، بدون اینکه داده‌ها از ماشین شما عبور کنند:

rsync -avz root@192.0.2.10:/var/www/ root@198.51.100.20:/var/www/

اگر پهنای باند شما محدود است، می‌توانید حداکثر سرعت انتقال را با گزینه --bwlimit تعیین کنید. برای مثال، محدود کردن به ۵ مگابایت بر ثانیه:

rsync -avz --bwlimit=5120 /data/ root@203.0.113.10:/data/

مقدار 5120 بر حسب کیلوبایت بر ثانیه است (یعنی ۵ مگابایت). این کار از اشباع شدن پهنای باند و اختلال در سرویس‌های دیگر جلوگیری می‌کند.

مقایسه کاربردی scp و rsync؛ کدام را انتخاب کنیم؟

انتخاب بین این دو ابزار به نیاز شما بستگی دارد. جدول زیر راهنمای سریعی است:

  • انتقال یک‌باره چند فایل کوچک: scp ساده‌تر و سریع‌تر است.
  • بکاپ‌گیری دوره‌ای و همگام‌سازی: rsync با انتقال افزایشی، انتخاب هوشمندانه‌ای است.
  • انتقال فایل‌های حجیم روی اتصال ناپایدار: rsync با --partial تنها گزینه منطقی است.
  • حفظ دقیق مجوزها و مالکیت فایل‌ها: rsync با گزینه -a برتری کامل دارد.
  • انتقال سریع و بدون نیاز به تنظیمات خاص: scp کافی است.

خطاهای رایج و رفع آن‌ها

در کار با این ابزارها، چند خطای رایج وجود دارد که بهتر است از قبل با آن‌ها آشنا باشید.

خطای Permission denied در scp و rsync

این خطا معمولاً به دو دلیل رخ می‌دهد: یا پسورد اشتباه است، یا کاربر مقصد به دایرکتوری مقصد دسترسی نوشتن ندارد. برای رفع مشکل دوم، ابتدا با SSH وارد سرور شوید و مجوز دایرکتوری را بررسی کنید:

ls -ld /var/backups/
chown root:root /var/backups/
chmod 755 /var/backups/

اگر از کاربر غیر ریشه استفاده می‌کنید، مطمئن شوید که کاربر به دایرکتوری مقصد دسترسی دارد.

مشکل در حفظ مالکیت فایل‌ها با rsync

اگر هنگام استفاده از -a خطای chown failed می‌بینید، به این معنی است که کاربر شما اجازه تغییر مالکیت فایل‌ها را در مقصد ندارد. این مشکل اغلب وقتی پیش می‌آید که از کاربر غیر ریشه استفاده می‌کنید. راه‌حل این است که یا از کاربر ریشه استفاده کنید، یا گزینه --no-owner را به دستور اضافه کنید تا مالکیت فایل‌ها از مبدأ کپی نشود:

rsync -avz --no-owner /data/ user@203.0.113.10:/data/

قطع شدن مکرر انتقال با rsync

اگر اتصال شما ناپایدار است، ترکیب گزینه‌های زیر را امتحان کنید:

rsync -avz --partial --progress --timeout=60 /data/ root@203.0.113.10:/data/

گزینه --timeout=60 باعث می‌شود اگر ۶۰ ثانیه هیچ داده‌ای رد و بدل نشد، اتصال بسته شود و rsync خطا بدهد. سپس می‌توانید دستور را در یک حلقه اجرا کنید تا زمانی که انتقال کامل شود:

until rsync -avz --partial --progress /data/ root@203.0.113.10:/data/; do echo "Retrying..."; sleep 5; done

این اسکریپت ساده، دستور را تا موفقیت کامل تکرار می‌کند.

نکات امنیتی مهم در انتقال فایل

اگرچه هر دو ابزار از SSH استفاده می‌کنند، اما چند نکته امنیتی را نباید فراموش کنید:

  • از کلید SSH به جای پسورد استفاده کنید. این کار هم امن‌تر است و هم امکان خودکارسازی را فراهم می‌کند.
  • هرگز فایل‌های حساس را با گزینه -z فشرده نکنید اگر نگران حملات side-channel هستید. فشرده‌سازی می‌تواند اطلاعاتی درباره محتوای فایل لو بدهد.
  • برای انتقال فایل‌های بسیار حساس، از گزینه -e "ssh -c aes256-gcm@openssh.com" استفاده کنید تا الگوریتم رمزنگاری قوی‌تری اعمال شود.
  • دسترسی کاربران را محدود کنید. اگر فقط نیاز به انتقال فایل دارید، می‌توانید از rsync در حالت daemon با مجوزهای محدود استفاده کنید، اما برای اکثر موارد، SSH معمولی کافی است.

جمع‌بندی و توصیه نهایی

انتقال فایل با scp و rsync دو مهارت پایه‌ای برای هر مدیر سروری است. scp برای کارهای سریع و ساده عالی است، اما برای بکاپ‌گیری منظم، همگام‌سازی دایرکتوری‌های بزرگ و انتقال فایل روی اتصال‌های ناپایدار، rsync بدون رقیب است. توصیه من این است که هر دو ابزار را در جعبه ابزار خود داشته باشید و بر اساس شرایط، یکی را انتخاب کنید.

اگر به دنبال زیرساختی هستید که این ابزارها در آن به خوبی کار کنند، سرویس‌های سرور ابری و اختصاصی سرورنت با پهنای باند مناسب و پایداری شبکه، گزینه مناسبی برای اجرای این انتقال‌ها هستند. اما فارغ از انتخاب زیرساخت، تسلط بر این دو ابزار، کیفیت کار شما را به طور قابل توجهی بهبود می‌بخشد.

در نهایت، پیشنهاد می‌کنم این دستورات را روی یک محیط آزمایشی تمرین کنید. یک فایل چند گیگابایتی بسازید، آن را با scp منتقل کنید و سپس با rsync همگام‌سازی کنید. تفاوت سرعت و رفتار این دو ابزار در شرایط واقعی، بهترین درس خواهد بود.

آیا این مطلب برایتان مفید بود؟