انتقال فایل بین دو سرور (Server) لینوکس (Linux) (در دو محل فیزیکی متفاوت و هر دو متصل به اینترنت) (با ایجاد ارتباط مستقیم SSH بین دو سرور، به شکل امن و با سرعت بالا، بر اساس sftp)، در ارتباط با سرور (Server) لینوکس (Linux) از طریق SSH
فرض کنید که قصد داریم یک فایل را از سرور (Server) قدیمی به سرور (Server) جدید منتقل کنیم (کپی کردن فایل از سرور قدیمی به سرور جدید). با فرض اینکه در هر دو سرور (Server)، دارای اجازه برقراری ارتباط SSH بر اساس sftp باشیم (یعنی کاربر root بوده و دارای دسترسی کامل برای برقراری ارتباط sftp باشیم)، به جای اینکه از روش های معمولی کپی کردن فایل از اینترنت به سرور جدید (مثلا کپی کردن فایل از آدرس اینترنتی (URL) آن به محلی در سرور جدید) استفاده کنیم (که امنیت پایینی دارد و ممکن است اطلاعات به سرقت روند)، می توانیم از طریق SSH ، یک ارتباط مستقیم بین دو سرور (Server) ایجاد کنیم (بر اساس sftp) و از طریق آن، به امنیت بالا، سرعت انتقال زیاد، امکان Resume کردن فایل هایی که ناقص منتقل شده اند (ادامه انتقال فایل های ناقص) و محاسن دیگر ارتباط SSH بر اساس sftp بهره ببریم.
امکان ارتباط SSH بین دو سرور، از دو طریق sftp و ftp وجود دارد، که البته بنده شدیدا sftp را توصیه می کنم، زیرا انتقال اطلاعات در آن، امنیت بالاتری دارد و امکان سرقت اطلاعات (شنود اطلاعات در مسیر انتقال)، کاهش می یابد (بنابراین اگرچه در این آموزش، در کنار اتصال sftp ، اتصال ftp را هم شرح داده ایم، اما توصیه می شود که فقط از sftp استفاده شود).
در سرورهایی (Server) که بنده با آنها کار کردم، تنها کاربر root می توانست از ارتباط امن sftp استفاده نماید. از اینکه چگونه سایر کاربران (User) نیز از این امکان استفاده کنند، بنده اطلاعی ندارم (می توانید در این مورد تحقیق کنید).
در واقع، کل فرآیند انتقال فایل ها از سرور (Server) قدیمی به سرور (Server) جدید می تواند به صورت 3 مرحله زیر اجرا گردد :
1- فشرده کردن فایل ها در سرور (Server) قدیمی، از طریق SSH (اینکه در یک یا چند فایل فشرده قرار بگیرند، بستگی به نظر شما دارد)
2- ایجاد ارتباط SSH مستقیم بین دو سرور (Server) و انتقال فایل های فشرده به سرور (Server) جدید
3- از حالت فشرده درآوردن فایل ها در سرور (Server) جدید، از طریق SSH
بنابراین مشاهده می کنید که برای انتقال فایل ها از سرور (Server) قدیمی به سرور (Server) جدید، تنها کافی است که از SSH استفاده کنید و از مزایای آن بهره ببرید. در این آموزش، ما مرحله دوم (مرحله انتقال فایل ها بین دو سرور (Server)) را شرح می دهیم (فشرده کردن و از حالت فشرده در آوردن فایل ها را در مباحث دیگر شرح داده ایم).
با فرض اینکه در سرور قدیمی، کاربر (User) دارای نام kelideir بوده است (فایل در قسمت فایل های این کاربر قرار داشته) و فایل مورد نظرمان نیز در مسیر زیر می باشد (فایل kelidestanir.tar.gz در پوشه اصلی وب سایت (یعنی پوشه public_html) مربوط به کاربر kelideir) :
و ما می خواهیم که کپی فایل در سرور جدید، در مسیر زیر قرار گیرد (پوشه اصلی وب سایت (یعنی پوشه public_html) مربوط به کاربر newkelidestan (فایل در قسمت مربوط به فایل های این کاربر قرار می گیرد)) :
بنابراین ابتدا توسط نرم افزار puTTy ( کلید شماره 736 )، از طریق SSH به سرور جدید که می خواهیم فایل در آن کپی شود، متصل می شویم (به عنوان کاربر root).
قبل از هر چیز، باید در سرور جدید، به مسیری (پوشه ای) برویم که می خواهیم فایل در آن کپی شود. یعنی باید پوشه فعلی (Current Working Directory) را با استفاده از دستور cd تغییر دهیم.
بنابراین دستور زیر را اجرا می کنیم تا به مسیر (پوشه) مورد نظرمان برای قرارگیری فایل برویم :
اگر می خواهید به عنوان کاربری ((غیر از کاربر root)) به سرور قدیمی متصل شوید، باید دستور زیر اجرا شود (به جای عبارت IP ، باید ip مربوط به سرور قدیمی (برای اتصال به آن) نوشته شود) (البته دقت کنید که این ارتباط از نوع ftp است و ارتباط ftp امنیت کمتری نسبت به sftp دارد) :
که بعد از اجرای آن، از شما نام کاربری (Username) و رمز عبور (Password) برای اتصال به سرور قدیمی درخواست می کند.
اما اگر می خواهید به عنوان کاربر root به سرور قدیمی متصل شوید (بر اساس ارتباط امن sftp)، باید به جای دستور بالا، دستور زیر اجرا شود (به جای عبارت IP ، باید ip مربوط به سرور قدیمی (برای اتصال به آن) نوشته شود) (ارتباط امن sftp) :
که بعد از اجرای آن، چون با توجه به دستور، معلوم است که به عنوان کاربر root می خواهید به سرور قدیمی متصل شوید، تنها رمز عبور (Password) را از شما درخواست می کند (به عنوان کاربر root).
در هر دو دستور بالا، به جای عبارت IP ، باید ip مربوط به سرور قدیمی (برای اتصال به آن) نوشته شود. به عنوان مثال :
یا :
در کدهای بالا، شماره پورت (Port) برای اتصال SSH را مشخص نکردیم، بنابراین شماره پورت (Port) پیش فرض برای اتصال SSH ، یعنی شماره 22 برای اتصال در نظر گرفته می شود، اما اگر شماره پورت (Port) برای اتصال SSH با شماره 22 فرق داشته باشد، با پیام خطا در هنگام اتصال روبرو می شوید و بنابراین، مثلا اگر با کنترل پنل DirectAdmin کار می کنید، باید مطابق کلید شماره 733 ، شماره پورت (Port) برای اتصال SSH را به دست آورده و به شکل زیر، در دستور ذکر نمایید :
برای دستور sftp :
که در آن، شماره پورت (Port) برای اتصال SSH ، برابر 1234 در نظر گرفته شده است.
و برای دستور ftp :
دقت کنید که شماره پورت (Port) برای اتصال SSH با شماره پورت (Port) برای وارد شدن (Login کردن) کاربران به کنترل پنل سرور، تفاوت دارد و این دو را با هم اشتباه نگیرید.
در مرحله اتصال، از شما پرسشی می شود که باید در پاسخ به آن، کلمه yes را تایپ کرده و سپس enter را بزنید و بعد اطلاعات کاربری (نام کاربری و رمز عبور) از شما دریافت می گردد.
بعد از اینکه سرور قدیمی، اطلاعات کاربری شما در آن سرور (سرور قدیمی) را از شما دریافت کرد و به آن متصل شدید، آنگاه توسط دستور cd می توانید به مسیری (پوشه ای) در سرور قدیمی بروید که فایل مورد نظرتان (فایل kelidestanir.tar.gz) در آن مسیر قرار گرفته است :
دستور بالا به این دلیل است که قبلا گفتیم فایل مورد نظرمان در مسیر home/kelideir/public_html/kelidestanir.tar.gz/ قرار گرفته است.
اگر به مسیر مورد نظر رفته اید و قصد دارید مطمئن شوید که فایل در آن مسیر قرار دارد، می توانید دستور ls را به صورت زیر به کار ببرید (نمایش فایل های عادی و فایل های پنهان) :
بنابراین پس از اطمینان از صحیح بودن مسیر و همچنین وجود داشتن فایل مورد نظر، برای کپی کردن فایل مورد نظر از سرور قدیمی به درون پوشه فعلی (Current Working Directory) در سرور جدید، دستور زیر را اجرا می کنیم (تنها نام فایل، یعنی kelidestanir.tar.gz ، در دستور ذکر می شود) :
بنابراین فایل مورد نظر در مسیر (پوشه) مورد نظرمان در سرور جدید، کپی می شود.
در هنگام انتقال فایل، حجمی از فایل که منتقل شده و همچنین درصد مربوط به مقدار منتقل شده از فایل (مثلا 20 درصد) و سرعت انتقال در هر لحظه و میزان زمان باقی مانده (به صورت تخمینی)، نمایش داده می شود تا بدانیم که انتقال فایل به چه میزان انجام شده است.
معمولا با شروع انتقال، سرعت انتقال ابتدا کم است و همین طور زیاد می شود تا به یک حد ماکزیمم سرعت برسد.
در تمام مدتی که به سرور قدیمی متصل هستیم، عبارت زیر در ابتدای خط ها نمایش داده می شود :
پس از آنکه فایل در سرور جدید کپی شد، برای اینکه اتصال با سرور قدیمی را قطع کنیم و در همین سرور جدید، دستورات مورد نظر خود برای کار با سرور جدید را اجرا نماییم، تنها کافی است که دستور زیر را اجرا نمایید :
بنابراین پس از قطع ارتباط با سرور قدیمی، دیگر عبارت sftp> را در ابتدای خط ها، مشاهده نخواهید کرد.
وقتی فایلی را توسط کاربر root ، به درون پوشه های مربوط به یک کاربر معمولی منتقل می کنیم، آنگاه در کنترل پنل آن کاربر معمولی، وقتی آن فایل را مشاهده می کند، دو مورد UID و GID برای آن فایل، برای کاربر root تعیین شده است و بنابراین آن کاربر معمولی نمی تواند کنترلی بر روی آن فایل داشته باشد (مثل Move کردن، Copy کردن و ...) :
حتی اگر کاربر root ، یک فایل فشرده را منتقل کرده باشد و خودش هم آن را از حالت فشرده در بیارود، باز هم آن پوشه ها و فایل هایی که ایجاد می شوند، دو مورد UID و GID آنها، برای کاربر root تعیین شده است.
برای رفع این مشکل، چون باید هر دو مورد را به کاربر kelideir تغییر دهیم، برای فایل kelidestanir.tar.gz ، دستور زیر را اجرا می نماییم :
که در آن، از الگوی کلی زیر استفاده شده است :
بنابراین نتیجه به صورت زیر می باشد :
و برای پوشه domains که در واقع قبلا با از حالت فشرده خارج کردن فایل kelidestanir.tar.gz ساخته شده است، کد زیر را اجرا می کنیم :
استفاده از عبارت R- در دستور بالا، اهمیت زیادی دارد و برای این است که هم پوشه تغییر داده شود و هم تمامی فایل ها و پوشه های درون آن، اما اگر عبارت R- از دستور حذف شود، تنها همان پوشه domains تغییر می کند و فایل ها و پوشه های درون آن، تغییر نخواهند کرد.
نتیجه به صورت زیر می باشد :
حتی اگر ابتدا برای فایل kelidestanir.tar.gz ، دو مورد UID و GID را برای کاربر عادی تعیین کنیم و بعد توسط کاربر root و از طریق اتصال SSH ، فایل kelidestanir.tar.gz را از حالت فشرده خارج نماییم، باز هم پوشه domains که ساخته می شود و کلیه فایل ها و پوشه های درون آن، در آنها، دو مورد UID و GID برابر کاربر root تعیین می شود (بنابراین باز هم نیاز به تغییر دارند). اما اگر خود کاربر عادی از طریق کنترل پنل DirectAdmin فایل را از حالت فشرده خارج کند، آنگاه هم پوشه domains که ساخته می شود و هم کلیه فایل ها و پوشه های درون آن، در آنها، دو مورد UID و GID برابر همان کاربر عادی تعیین می شود (نه کاربر root).
ارتباط از طریق SSH بر اساس sftp را بنده برای دو سرور که یکی در آلمان و دیگری در ایران بود، امتحان کردم (در تاریخ 1397/06/17) که سرعت انتقال فایل بین آنها، حدود 2.8 مگابایت بر ثانیه ( 2.8 MB/s ) می بود.
در هنگام انتقال فایل بین دو سرور، از طریق SSH بر اساس sftp ، برای بنده در چند بار اتفاق افتاد که با قطع شدن اینترنت، انتقال فایل بین دو سرور، متوقف شده بود و مجبور شدم که از دستور reget برای انتقال فایل از ادامه آن (Resume کردن)، استفاده نمایم (البته یک بار، با وجود قطع اینترنت، انتقال فایل ادامه یافته بود و فایل به صورت کامل منتقل شده بود).
دستور reget در ادامه توضیح داده شده است.
اگر بخشی از فایل منتقل شود و به هر دلیلی، ادامه انتقال فایل متوقف گردد، نیازی نیست که حتما فایل را ازابتدای آن منتقل کنید، بلکه می تواند انتقال از ادامه فایل باشد (Resume کردن انتقال)، برای این منظور، باید به جای دستور get ، دستور reget را به کار ببرید :
البته استفاده از عبارت a- در دستور get نیز می تواند معادل دستور بالا باشد، اما چون بنده هنوز این شکل استفاده از دستور get را تست نکرده ام (reget را تست کردم و صحیح عمل کرد)، توصیه می شود عبارت دقیق استفاده از دستور get به همراه عبارت a- را از منابع دیگر بخوانید و قبل از استفاده، از عملکرد صحیح آن اطمینان پیدا کنید.
شاید این سوال پیش بیاید که آیا انتقال همزمان چند فایل، باعث بیشتر شدن سرعت انتقال می شود یا خیر. بنده این مورد را در منابع (سایت های) مختلف بررسی کردم و در آنها ذکر شده بود که انتقال همزمان چند فایل، باعث بیشتر شدن سرعت انتقال نمی شود و تنها پهنای باند بین آنها تقسیم می گردد و در سرعت کلی تاثیری ندارد (البته بهتر است که خودتان نیز در این زمینه تحقیق کنید).
دامنه وب سایت کلیدستان برابر kelidestan.com می باشد، اما دامنه kelidestan.ir که در این آموزش در مواردی ذکر شد (گاهی برای تست آموزش ها به کار می رود)، برای این است که اگر کاربری به اشتباه دامنه kelidestan.ir را در مرورگر اینترنت خود وارد کرد، آن را به دامنه kelidestan.com هدایت کنیم (دامنه kelidestan.ir را برای این منظور تهیه کرده ایم). همپنین دامنه kdes.ir را نیز برای ساخت لینک های کوتاه برای وب سایت کلیدستان (kelidestan.com) به کار می بریم که طول URL آنها کوتاه باشد.
این نکته ربطی به آموزش ما نداشت و تنها برای این تذکر داده شد که دلیل وجود آن دو دامنه و استفاده کلیدستان از آنها را بدانید.