لینوکس و من

چند ترفند ssh برای انتقال فایل

یکی از مشکلات همیشگی هنگام اتصال به سرورها از طریق شبکه، انتفال فایل است. ابزار هایی مثل sftp با وجود کارایی فراوان، مشکلاتی هم دارند، مثلا استفاده مکرر از آنها ملال‌آور است و اصلا برای اسکریپت نویسی مناسب نیستند و مشکلاتی مثل سطح دسترسی و غیره هم ممکن است رخ دهد.
یک راه حل جالب برای این مشکلات استفاده مستقیم از خود ssh است. مثلا به کمک دستور زیر میتوان فایلی را از سرور به کلاینت منتقل کرد.
ssh <server_ip> cat /path/to/file >/path/to/file/on/client
حال برای مثال اگر با فایلی مواجه باشیم که خواندن آن نیاز به دستور روت دارد به سادگی میتوان نوشت:
ssh -tt <server_name> sudo cat /path/to/file > /path/to/save/file
اما مزایای این روش فقط به همین جا محدود نمیشود میتوان کار های جالب تری انجام داد که برای sftp غیر ممکن است. مثلا:
 ssh <server_ip> curl http://example.com >/path/to/save
ssh <server_ip> "dd if=/dev/sdx |gzip -c9" >/path/to/save
که از اولی میتوان برای دانلود مستقیم یک فایل به کمک ssh و از دومی برای بکاپ گرفتن از یک سیستم روی شبکه کمک گرفت. تقربیا میتوان از هر ترکیبی استفاده کرد. و stdout هر دستوری را که روی سرور اجرا میشود مستقیما روی کلاینت ذخیره کرد و از مزایای رمزنگاری و ارتباط امن ssh بهره برد.
علاوه بر این میتوان از این مزیت در جهت عکس نیز استفاده کرد. مثلا به کمک این دستور میتوان از سیستم بکاپ گرفت و مستقیما روی یک کامپیوتر روی شبکه ذخیره کرد:
"dd if=/dev/sdx| gzip -c9 |ssh <server_name> "cat > /path/to/file
تذکر: فراموش کردن " ها میتواند نتایج جالبی داشته باشد :)
حتی میتوان فایل هایی را بازنویسی کرد که ویرایش آنها نیاز به دستور روت دارد.
cat /file/on/client |ssh -tt <server_address> sudo tee /path/to/file
نکته:‌ درصورت استفاده از sudo در دستورات ssh باید از سویچ -tt استفاده کنید.

علاوه بر همه این مثال ها میتوان از قدرت bash و ابرازهای مختلف استفاده کرد و به ترکیب‌های هیجان‌انگیز بیشتری رسید. اگر مثال های جالبتری به ذهنتان رسید آنهارا باما در میان بگذارید.

آپدیت:
به توصیه یکی از دوستان تصمیم گرفتم توضیح مختصری درباره دستور scp به این پست اضافه کنم.
دستور scp مثل خیلی از ابزارهای گنو/لینوکس دو خصوصیت مهم داره. سادگی: یعنی فقط یک یا چند کار خاص انجام میدهد ؛ کاربردی و قابلیت اعتماد: یعنی با اینکه فقط یک کار خاص انجام میدهد اما آن را به بهترین شکل ممکن انجام میدهد.
یکی از ساده‌ترین کاربرد های این دستور انتقال یک فایل به یک سرور ssh است.
 scp /path/to/source/file user@server:/destination/folder

خب این دستور خیلی ساکته! تا وقتی کارش تموم نشده درباره سرعت و انتقال و پروسه ارسال چیزی نمیگه. برای اینکه به حرف بیاد میتونیم از سویچ -p استفاده کنیم.
در مثال‌های بالا در انتقال با ssh درباره فشرده سازی فایل هنگام انتقال چند مثال داشتیم. خب الآن با سویچ -C (بزرگ) فایل قبل از ارسال فشرده شده و پس از آن روی سرور به حالت قبل برمیگرده!
از این دستور میشود برای انتقال یک پوشه هم استفاده کرد. خیلی ساده سویچ -r به صورت بازگشتی تمام شاخه‌ها را به سرور انتقال میدهد.
علاوه بر این اگر برای امنیت سرور پورت ssh رو تغییر داده اید سویچ -P دوست شماست! (بسیاری از سویچ‌های ssh و scp مشابه هستند! به man مراجعه کنید!)
گفتم این انتقال فایل ساده‌ترین کاربرد scp است. خب بریم سراغ معجزه اصلی!
 scp user@server1:/path/to/source/file1 /path/to/source/file2... user@server2:/destination/folder
درست متوجه شدید. به کمک این دستور میتوان چندین فایل را از یک سرور به سرور دیگه منتقل کرد. تصور کنید بدون این دستور این کار چقدر دردسر داره!

پ.ن: با توجه به وضعیت اینترنت پـــرسرعت این دستور میتونه خیلی هم عجیب و بی‌مصرف به نظر برسه! چون شما به عنوان رابط بین این دو سرور عمل میکنید و هر فایل اول برای شما و سپس به سرور دوم ارسال خواهد شد.
پ.ن 2: از دستور scp میتوان برای دانلود فایل از سرور نیز استفاده کرد.

نظرات  (۱)

  • سید مرتضی سجادی
  • ابزار scp رو هم توضیح بدید. دستور خوبیه
    پاسخ:
    ممنون بخاطر معرفی دستور! پست آپدیت شد.