آموزش سرور

انتقال فایل به سرور با SCP، SFTP و WinSCP (ویندوز، مک و لینوکس)

تهیه: کلودیفای (نگارش با کمک هوش مصنوعی) · انتشار: · زمان مطالعه: ۷ دقیقه

root@server: ~$ scp -P 2222 site.zip root@203.0.113.10site.zip 100% ... $ rsync -avP ./data/ root@203.0.113.10:/sending incremental file list...sent ... bytes received ... bytesSCPSFTPWinSCPآموزش سرورانتقال فایل به سرور باSCP، SFTP و WinSCP(ویندوز، مک و لینوکس)مجلهٔ کلودیفایclodify.net/blog
پاسخ کوتاه

برای انتقال فایل به سرور لینوکس به نرم‌افزار جداگانه‌ای روی سرور نیاز ندارید؛ همان SSH کافی است. در ترمینال با scp فایل را کپی کنید، با sftp به‌صورت تعاملی فایل‌ها را مدیریت کنید و برای پوشه‌های بزرگ یا انتقال‌هایی که ممکن است قطع شوند از rsync استفاده کنید. کاربران ویندوز می‌توانند با WinSCP یا FileZilla و پروتکل SFTP، فایل‌ها را با کشیدن و رها کردن جابه‌جا کنند.

همه‌چیز از SSH شروع می‌شود

بیشتر کسانی که اولین سرور مجازی خود را می‌گیرند، بعد از اولین ورود با یک سؤال روبه‌رو می‌شوند: «حالا فایل‌های سایت یا ربات را چطور روی سرور ببرم؟» خبر خوب این است که اگر به سرور SSH دارید، ابزار انتقال فایل هم دارید. SCP و SFTP هر دو روی همان اتصال رمزنگاری‌شدهٔ SSH کار می‌کنند، از همان پورت و همان نام کاربری و رمز یا کلید استفاده می‌کنند و نصب هیچ سرویس اضافه‌ای مثل FTP روی سرور لازم نیست.

اگر هنوز به سرور وصل نشده‌اید، ابتدا آموزش اتصال به سرور با SSH را بخوانید. در این مقاله فرض می‌کنیم آی‌پی سرور 203.0.113.10 و نام کاربری root است؛ این‌ها را با مقادیر خودتان جایگزین کنید.

مسیر انتقال فایل روی SSH
فایلSFTPکامپیوتر شماscp / WinSCPتونل SSHرمزنگاری‌شدهسرور لینوکسsshd روی پورت ۲۲فایلSFTPکامپیوتر شماscp / WinSCPتونل SSHرمزنگاری‌شدهسرور لینوکسsshd روی پورت ۲۲
شکل ۱ SCP، SFTP و rsync همگی از همان اتصال رمزنگاری‌شدهٔ SSH استفاده می‌کنند؛ سرویس جداگانه‌ای روی سرور لازم نیست.

مقایسهٔ سریع ابزارها

ابزار مناسب برای ویژگی مهم
scp کپی سریع یک فایل یا پوشه ساده، یک خطی
sftp مرور و مدیریت تعاملی فایل‌ها دستورهای ls، get، put
rsync پوشه‌های بزرگ، بکاپ، همگام‌سازی فقط تغییرات را می‌فرستد، ادامهٔ انتقال قطع‌شده
WinSCP / FileZilla کاربران ویندوز و محیط گرافیکی کشیدن و رها کردن

قاعدهٔ کلی: برای یک فایل scp، برای کار روزمره با فایل‌ها sftp یا WinSCP، و برای هر انتقالی که حجمش زیاد است یا قرار است تکرار شود rsync.

آپلود و دانلود با SCP

ساختار دستور scp همیشه «مبدأ سپس مقصد» است. مسیر روی سرور با الگوی user@host:/path نوشته می‌شود. این دستورها را روی کامپیوتر خودتان اجرا کنید، نه داخل سرور:

# آپلود یک فایل به پوشهٔ /root سرور
scp backup.zip root@203.0.113.10:/root/

# دانلود یک فایل از سرور به پوشهٔ جاری
scp root@203.0.113.10:/var/log/nginx/error.log .

# آپلود یک پوشهٔ کامل (بازگشتی)
scp -r ./my-site root@203.0.113.10:/var/www/

# پورت SSH غیرپیش‌فرض (حرف P بزرگ)
scp -P 2222 app.tar.gz root@203.0.113.10:/opt/

دقت کنید که در scp پورت با -P بزرگ مشخص می‌شود، در حالی که در دستور ssh با -p کوچک است. این تفاوت کوچک یکی از رایج‌ترین دلایل خطای اتصال است.

در ویندوز ۱۰ و ۱۱، کلاینت OpenSSH به‌طور پیش‌فرض نصب است؛ پس همین دستورها در PowerShell هم کار می‌کنند. فقط مسیرهای محلی را به شکل ویندوزی بنویسید؛ مثلاً scp C:\Users\me\site.zip root@203.0.113.10:/root/.

کار تعاملی با SFTP

اگر می‌خواهید روی سرور بگردید، چند فایل را جابه‌جا کنید یا پوشه بسازید، sftp راحت‌تر است. یک نشست باز می‌شود که در آن دستورهایی شبیه دستورهای لینوکس دارید:

sftp root@203.0.113.10
sftp> pwd              # مسیر فعلی روی سرور
sftp> lpwd             # مسیر فعلی روی کامپیوتر خودتان
sftp> cd /var/www
sftp> put index.html   # آپلود
sftp> get config.php   # دانلود
sftp> put -r assets    # آپلود پوشه
sftp> mkdir uploads
sftp> exit

دستورهایی که با l شروع می‌شوند (مثل lcd و lls) روی سیستم محلی اجرا می‌شوند و بقیه روی سرور. برای پورت دیگر از sftp -P 2222 root@203.0.113.10 استفاده کنید.

user@laptop: ~
$ scp -P 2222 site.zip root@203.0.113.10:/root/site.zip                    100%  ...   ...MB/s   00:...$ rsync -avP ./data/ root@203.0.113.10:/opt/data/sending incremental file list...sent ... bytes  received ... bytes$ 
شکل ۲ scp برای کپی سریع و rsync برای همگام‌سازی پوشه‌ها؛ هر دو روی کامپیوتر خودتان اجرا می‌شوند.

انتقال حرفه‌ای با rsync

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

# همگام‌سازی پوشه با نمایش پیشرفت و فشرده‌سازی در مسیر
rsync -avz --progress ./my-site/ root@203.0.113.10:/var/www/my-site/

# ادامه دادن انتقال فایل بزرگ قطع‌شده
rsync -avP big-file.iso root@203.0.113.10:/root/

# پورت غیرپیش‌فرض
rsync -avz -e "ssh -p 2222" ./data/ root@203.0.113.10:/opt/data/

# اجرای آزمایشی بدون تغییر واقعی
rsync -avzn --delete ./my-site/ root@203.0.113.10:/var/www/my-site/

به اسلش انتهای مسیر مبدأ دقت کنید: ./my-site/ یعنی «محتوای پوشه» و ./my-site یعنی «خود پوشه». گزینهٔ --delete فایل‌هایی را که در مبدأ نیستند از مقصد پاک می‌کند؛ همیشه اول با -n (اجرای آزمایشی) نتیجه را ببینید.

برای فایل‌هایی که از قبل فشرده هستند (zip، mp4، jpg) گزینهٔ -z فایده‌ای ندارد و فقط CPU مصرف می‌کند؛ در این حالت آن را حذف کنید.

انتقال گرافیکی در ویندوز با WinSCP

اگر با خط فرمان راحت نیستید، WinSCP رایگان و ساده است:

  1. WinSCP را نصب و اجرا کنید.
  2. در پنجرهٔ Login، پروتکل (File protocol) را روی SFTP بگذارید.
  3. در Host name آی‌پی سرور، در Port number پورت SSH (پیش‌فرض ۲۲) و نام کاربری و رمز را وارد کنید.
  4. اگر با کلید وارد می‌شوید، از Advanced ← SSH ← Authentication فایل کلید خصوصی را انتخاب کنید (WinSCP کلید OpenSSH را به فرمت ppk تبدیل می‌کند).
  5. Login را بزنید؛ سمت چپ کامپیوتر شما و سمت راست سرور است و فایل‌ها را با کشیدن جابه‌جا می‌کنید.

FileZilla هم همین کار را انجام می‌دهد؛ فقط هنگام اتصال آدرس را به شکل sftp://203.0.113.10 بنویسید تا به‌جای FTP از SFTP استفاده کند. FTP ساده رمز را بدون رمزنگاری می‌فرستد و روی سرورهای امروزی نباید فعالش کنید.

امنیت و ورود بدون رمز

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

اگر می‌خواهید کسی فقط به یک پوشه دسترسی SFTP داشته باشد و نتواند دستور اجرا کند، می‌توانید با تنظیم ChrootDirectory و ForceCommand internal-sftp در فایل sshd_config او را محدود کنید. جزئیات این گزینه‌ها در مستندات OpenSSH آمده است.

scp یا rsync؟
scp
  • یک دستور ساده برای یک فایل
  • هر بار کل فایل را می‌فرستد
  • انتقال قطع‌شده از اول شروع می‌شود
  • روی هر سیستم با OpenSSH موجود است
در برابر
rsync
  • مناسب پوشه‌های بزرگ و بکاپ
  • فقط تغییرات را می‌فرستد
  • با -P انتقال قطع‌شده ادامه می‌یابد
  • باید روی هر دو طرف نصب باشد
شکل ۳ برای کارهای تکراری و حجم بالا rsync و برای کپی سریع scp را انتخاب کنید.

فشرده کردن پیش از انتقال تعداد زیادی فایل کوچک

انتقال هزاران فایل کوچک (مثلاً پوشهٔ node_modules یا فایل‌های یک سایت وردپرسی) با scp کند است، چون برای هر فایل کار جداگانه‌ای انجام می‌شود. در این حالت بهتر است ابتدا پوشه را در یک فایل آرشیو بسته‌بندی کنید، فقط همان یک فایل را منتقل کنید و روی سرور باز کنید:

tar -czf site.tar.gz my-site/
scp site.tar.gz root@203.0.113.10:/var/www/
ssh root@203.0.113.10 "cd /var/www && tar -xzf site.tar.gz && rm site.tar.gz"

حتی می‌توانید بدون ساخت فایل میانی، خروجی tar را مستقیم از راه SSH بفرستید: tar -cz my-site | ssh root@203.0.113.10 "tar -xz -C /var/www". این روش برای مهاجرت سایت از یک سرور به سرور دیگر هم بسیار کاربردی است.

خطاهای رایج و راه‌حل

Permission denied: یا رمز و کلید اشتباه است، یا کاربر شما روی پوشهٔ مقصد اجازهٔ نوشتن ندارد. مثلاً کاربر عادی نمی‌تواند مستقیم در /var/www بنویسد؛ فایل را در پوشهٔ خانه آپلود کنید و سپس روی سرور با sudo mv جابه‌جا کنید.

Connection timed out یا Connection refused: مشکل از خود اتصال SSH است، نه از scp. پورت، فایروال و روشن بودن سرور را بررسی کنید؛ مقالهٔ رفع خطای Connection timed out در SSH مراحل را قدم‌به‌قدم توضیح می‌دهد.

No such file or directory: مسیر مبدأ یا مقصد اشتباه است. اگر نام فایل فاصله دارد، آن را در کوتیشن بگذارید.

سرعت پایین: سرعت انتقال به مسیر شبکه بین شما و سرور بستگی دارد. برای انتقال حجم زیاد بین دو سرور، دستور را مستقیم روی یکی از سرورها اجرا کنید تا داده از اینترنت خانگی شما عبور نکند. اگر سرور در ایران است، ترافیک دانلود آن جداگانه محاسبه می‌شود؛ جزئیات را در صورتحساب ترافیک سرور ایران ببینید.

جمع‌بندی برای انتخاب سریع

برای یک فایل از scp، برای مرور و مدیریت فایل‌ها از sftp یا WinSCP و برای پوشه‌های بزرگ، مهاجرت سایت و بکاپ از rsync استفاده کنید. همه روی SSH هستند، پس امنیت انتقال به امنیت ورود SSH شما بستگی دارد. اگر سرور جدیدی برای میزبانی پروژه لازم دارید، سرور مجازی ایران و سرور خارج کلودیفای هر دو با دسترسی SSH کامل تحویل داده می‌شوند.

سؤالات متداول

تفاوت SFTP و FTP چیست؟

FTP پروتکلی قدیمی است که نام کاربری، رمز و فایل‌ها را بدون رمزنگاری منتقل می‌کند و سرویس جداگانه‌ای لازم دارد. SFTP روی SSH کار می‌کند، همه‌چیز را رمزنگاری می‌کند و بدون نصب سرویس اضافه روی هر سرور لینوکسی که SSH دارد در دسترس است.

چرا scp با -p کوچک پورت را نمی‌شناسد؟

در scp گزینهٔ -p کوچک برای حفظ زمان و مجوز فایل‌هاست و پورت با -P بزرگ تعیین می‌شود. در دستور ssh برعکس، پورت با -p کوچک است.

انتقال فایل بزرگ وسط کار قطع شد؛ باید از اول شروع کنم؟

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

بهترین روش انتقال فایل از یک سرور به سرور دیگر چیست؟

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

آماده‌اید؟ سرورتان را بسازید.

از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی

سرورتان را همین حالا بسازید.

ساعتی بپردازید. هر وقت خواستید حذف کنید.