آموزش استفاده از SFTP برای انتقال ایمن فایلها با سرور راه دور
در این مقاله میخوانید
پروتکل انتقال فایل یا File Transfer Protocol (بهاختصار FTP) روشی محبوب و رمزگذارینشده برای انتقال فایلها بین دو سیستم راه دور است. بااینحال از سال ۲۰۲۲، اکثر نرمافزارهای مدرن بهدلیل کمبود امنیت از آن استفاده نمیکنند و بیشتر در برنامههای قدیمی بهکار میرود.
Secure File Transfer Protocol (بهاختصار SFTP) پروتکلی جداگانه از SSH است و دستورهای FTP را روی اتصالی امن پیادهسازی میکند. معمولاً SFTP میتواند بهعنوان جایگزین در هر زمینهای که دسترسی سرور FTP نیاز است، عمل کند.
تقریباً در بیشتر مواقع، SFTP بهدلیل ویژگیهای امنیتی زیربنایی و توانایی قرارگرفتن روی اتصال SSH به FTP ترجیح داده میشود. پروتکل FTP تا حدی ناامن است؛ ازاینرو، تنها در موارد محدود یا در شبکههای مطمئن باید استفاده شود.
ازآنجاکه SFTP در بسیاری از ابزارهای گرافیکی قرار داده شده است، در مقاله حاضر، نحوه استفاده از آن را ازطریق رابط کاربری تعاملی کامند لاین (interactive command line interface) آموزش خواهیم داد.
نحوه اتصال به SFTP
بهطور پیشفرض، SFTP از پروتکل SSH برای احراز هویت و ایجاد اتصال امن استفاده میکند؛ بههمیندلیل، همان روشهای احراز هویت موجود در SSH در SFTP نیز استفاده شده است.
بهطور پیشفرض، میتوان با رمزعبور احراز هویت کرد؛ اما توصیه میکنیم ابتدا کلیدهای SSH را ایجاد کنید و سپس کلید عمومی خود را به سیستم موردنیاز برای دسترسی انتقال دهید. این روش بسیار امنتر است و در طولانیمدت در وقت شما صرفهجویی کند.
اگر قبلاً این کار را نکردهاید، لطفاً این راهنما را بخوانید تا کلیدهای SSH را برای دسترسی به سرور خود تنظیم کنید. درصورت امکان، با استفاده از SSH به دستگاه متصل شوید. بدینترتیب، تمام الزامات لازم برای استفاده از SFTP در مدیریت فایلها را تکمیل کردهاید. با دستور زیر دسترسی SSH را آزمایش کنید:
$ ssh sammy@your_server_ip_or_remote_hostname
اگر جواب داد، با تایپکردن دستور زیر خارج شوید:
$ exit
اکنون، میتوانید با صدور دستور زیر SFTP Session ایجاد کنید:
$ sftp sammy@your_server_ip_or_remote_hostname
درادامه، به سیستم ریموت متصل خواهید شد و prompt شما به SFTP prompt تغییر میکند.
اگر روی پورت SSH سفارشی کار میکنید (غیر از پورت پیشفرضِ 22)، میتوانید SFTP Session را بهصورت زیر باز کنید:
$ sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname
این دستور شما را ازطریق پورت مشخصشده به سیستم ریموت متصل میکند.
چگونه به SFTP وصل شویم؟
استفاده از Help در SFTP
مفیدترین Command مورداستفاده دستور Help است. این دستور به شما امکان میدهد به خلاصهای از سایر دستورهای SFTP دسترسی داشته باشید. با تایپ یکی از این موارد زیر در prompt، آن را فراخوانی کنید:
sftp> help
یا
sftp> ?
با این کار فهرستی از دستورهای موجود نمایش داده میشود:
Output Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own' df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . .
برخی از دستورها را در بخشهای بعدی بررسی خواهیم کرد.
مقالهی زیر مقایسه کاملی است از دو سرویس انتقال فایل FTP و SFTP و موارد استفادهی آنها
نحوه استفاده از Help در SFTP
Navigation با SFTP
با استفاده از تعدادی دستور که مشابه دستورهای Shell هستند، مسیرهای مختلف بین فایلها (اصطلاحاً Navigation) را در سیستم ریموت میتوانید جستوجو کنید. ابتدا با یافتن دایرکتوری فعلیِ خود در سیستم ریموت، مسیریابی را شروع کنید. درست مانند Session معمولی Shell، میتوانید موارد زیر را برای دریافت دایرکتوری فعلی تایپ کنید:
sftp> pwd
Output Remote working directory: /home/demouser
محتویات دایرکتوری فعلی از سیستم ریموت را میتوانید با دستور آشنای دیگری ببینید:
sftp> ls
Output Summary.txt info.html temp.txt testDirectory
توجه کنید که دستورهای موجود در اینترفیسِ SFTP با سینتکست معمولی Shell مطابقت یکبهیک ندارند و ازنظر ویژگیها نیز تکامل چندانی ندارند. بااینحال، آنها برخی از flagهای اختیاری مهمتر را پیادهسازی میکنند؛ مانند افزودن la- به ls برای مشاهده متادیتاها و permissionهای بیشتر:
sftp> ls –la
Output drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .
برای رسیدن به دایرکتوری دیگر، میتوانید این دستور را صادر کنید:
sftp> cd testDirectory
اکنون، میتوانید از سیستم فایل ریموت عبور کنید؛ اما چگونه میتوانید به فایلهای سیستم لوکالِ خود دسترسی پیدا کنید؟ با قراردادن یک l (نشاندهنده local) قبل از دستورها، مستقیماً کامندهایی برای دسترسی به فایلهای سیستم لوکال میزنید. تاکنون، تمام دستورهای ذکرشده معادلهایی برای سیستم local داشتهاند. با این دستور دایرکتوری لوکال در حال کار را میتوانید چاپ کنید:
sftp> lpwd
Output Local working directory: /Users/demouser
با دستور زیر میتوانید محتویات دایرکتوری فعلی را در ماشین لوکال فهرست کنید:
sftp> lls
Output Desktop local.txt test.html zebra.html analysis.rtf Documents
همچنین، دایرکتوری مدنظر در سیستم لوکال برای تعامل را میتوانید تغییر دهید:
sftp> lcd Desktop
روش انتقال فایل بین دو سرور با استفاده از SFTP
انتقال فایلها با SFTP
برای دانلود فایلها از هاست خود، با استفاده از دستور get اقدام کنید:
sftp> get remoteFile
Output Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
همانطورکه میبینید، بهطور پیشفرض، دستور get فایل ریموت را به فایلی با همان نام در سیستم لوکال دانلود میکند.
بعدازآن، میتوانید فایل ریموت را به نام دیگری (با تعیین نام) کپی کنید:
sftp> get remoteFile localFile
دستور get برخی از گزینههای flagها را نیز میپذیرد. بهعنوان مثال، میتوانید یک دایرکتوری و تمام محتویات آن را با تعیین گزینه بازگشتی (Recursive Option) کپی کنید:
sftp> get -r someDirectory
همچنین، میتوانید به SFTP بگویید که مجوزها و زمانهای دسترسی مناسب را با استفاده از فلگ P- یا p- حفظ کند:
sftp> get -Pr someDirectory
برای آموزش انتقال ایمن فایل بین دو سرور لینوکسی مقالهی زیر را از دست ندهید.
انتقال فایلهای لوکال به سیستم ریموت
انتقال فایلها به سیستم ریموت بههمینصورت انجام میشود؛ اما با دستور put:
sftp> put localFile
Output Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00
همان flagهایی که با get کار میکنند، برای put نیز اعمال میشوند. بنابراین برای کپیکردن کل دایرکتوری لوکال، میتوانید put -r را اجرا کنید:
sftp> put -r localDirectory
دستور df یکی از ابزارهای آشنایی بهشمار میآید که برای دانلود یا آپلود فایلها مفید است. این دستور مشابه ورژنِ Command Line عمل میکند و با استفاده از آن، میتوانید بررسی کنید که فضای کافی برای تکمیل نقلوانتقالات مدنظر خود دارید یا نه:
sftp> df –h
Output Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%
لطفاً توجه کنید که هیچ نوع لوکالی از این دستور وجود ندارد؛ اما میتوانید با استفاده از کامند ! آن را دور بزنید. دستور ! شما را به Shell لوکال میفرستد؛ جایی که هر فرمانی را در سیستم لوکال میتوان اجرا کرد. میتوانید Disk Usage را با تایپ دستورهای زیر بررسی کنید:
sftp> !
و سپس
$ df –h
Output Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home
هر کامند لوکال دیگر نیز بههمینمنوال کار خواهد کرد. برای بازگشت، به سشنِ SFTP تایپ کنید:
$ exit
حال باید بازگشت SFTP propmt را ببینید.
آموزش اتصال به سرور SFTP و انتقال فایلها به ریموت
دستکاری فایلهای ساده با SFTP
SFTP به شما امکان میدهد فایلهای سیستمی نگهداریشده را اجرا کنید. بهعنوان مثال، میتوانید owner فایلی را در سیستم ریموت با استفاده از خط زیر تغییر دهید:
sftp> chown userID file
توجه کنید که برخلاف دستور chmod سیستم، کامندِ SFTP نام کاربری را نمیپذیرد؛ اما درعوض از UID استفاده میکند. متأسفانه هیچ راه ازپیشدرنظرگرفتهشدهای بهصورت built-in برای دانستن UID مناسب ازطریق رابط SFTP وجود ندارد. بهعنوان Workaround، میتوانید از فایلِ /etc/passwd که نامهای کاربری را به UIDها در اکثر محیطهای لینوکس مرتبط میکند، بخوانید:
sftp> get /etc/passwd sftp> !less passwd
Output root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . .
توجه کنید که چگونه بهجای بهکارگیری دستور ! بهخودیخود، از آن بهعنوان prefix دستورِ Shell لوکال استفاده کردهاید. این برای اجرای هر دستور موجود در ماشین لوکال کار میکند و قبلتر میتوانست با دستور محلی df استفاده شود.
UID همانطورکه بهوسیله کاراکترهای colon مشخص شده است، در ستون سوم فایل قرار خواهد گرفت. بههمینترتیب، owner گروه یک فایل را با استفاده از خط زیر میتوانید تغییر دهید:
sftp> chgrp groupID file
بازهم هیچ راه built-in برای دریافت فهرستی از گروههای سیستم ریموت وجود ندارد و با دستور زیر میتوانید آن را دور بزنید:
sftp> get /etc/group sftp> !less group
Output root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .
ستون سوم ID گروه مرتبط با نامهای ستون اول را نگه میدارد که همان چیزی است که شما بهدنبال آن هستید. دستور chmod از SFTP معمولاً در سیستمفایل ریموت کار میکند:
sftp> chmod 777 publicFile
Output Changing mode on /home/demouser/publicFile
هیچ دستور معادلی برای دستکاری permissionهای فایل local وجود ندارد؛ اما میتوانید local umask را تنظیم کنید. دراینصورت هر فایلی که در سیستم local کپی شد، مجوزهای مرتبط خود را خواهد داشت. این کار با دستور lumask انجامشدنی است:
sftp> lumask 022
Output Local umask: 022
اکنون، تمام فایلهای معمولی دانلودشده تا زمانی که از فلگ p- استفاده نشده باشد، ۶۴۴ پرمیشن خواهند داشت. همچنین، SFTP امکان ایجاد دایرکتوریها در هر دو سیستم لوکال و از ریموت را بهترتیب بهواسطه lmkdir و mkdir ایجاد کنید. بقیه دستورهای فایل فقط سیستم فایل ریموت را هدف قرار میدهند:
sftp> ln sftp> rm sftp> rmdir
این دستورها رفتار اصلی معادلهای Shell خود را تکرار میکنند. اگر میخواهید این اقدامات را در سیستم فایل لوکال انجام دهید، با صدور این دستور به Shell وارد شوید:
sftp> !
یا با اجرای دستوری با پیشوند ! در سیستم لوکال مانند:
sftp> !chmod 644 somefile
هنگامی که سشن SFTP خود را بهپایان رساندید، از exit یا bye برای بستن اتصال استفاده کنید:
sftp> bye
جمعبندی
سینتکس SFTP بسیار کمتر از ابزارهای Shell مدرن است؛ اما میتواند برای ارائه سازگاری با سینتکسِ FTP قدیمی یا محدودکردن عملکردهای موجود برای کاربران ریموت در برخی از محیطها مفید باشد.
اگر به استفاده از FTP یا SCP برای انجام نقلوانتقالات خود عادت دارید، SFTP راه مناسبی برای استفاده از ویژگیهای مثبت هر دو محسوب میشود. این برای هر موقعیتی مناسب نیست؛ ولی ابزار انعطافپذیر مطلوبی دراختیارتان قرار میدهد.
سؤالات متداول
1. چگونه انتقال SFTP را تنظیم کنیم؟
- ایجاد کلیدهای SSH
- کپیکردن کلید عمومی SSH در سرور ریموت
- راهاندازی اتصال SFTP
انتقال فایلها از سرورهای ریموت به سیستمهای لوکال - انتقال فایلها از سیستمهای لوکال به سرورهای ریموت
2. چگونه فایلها را به سرور ریموت منتقل کنیم؟
برای کپی فایلها از سیستم لوکال به سرور ریموت یا سرور ریموت به سیستم لوکال، میتوانید از دستور SCP استفاده کنید. SCP مخفف Secure Copy و دستوری است که برای کپیکردن فایلها ازطریق ترمینال استفاده میشود. همچنین، میتوانید از SCP در لینوکس و ویندوز و مک استفاده کنید.
3. آیا هنگام انتقال، SFTP فایل را قفل میکند؟
برای جلوگیری از تغییر فایلها بهوسیله کاربران درحالیکه SFTP آنها را منتقل میکند، قفل فایل SFTP را میتوانید فعال کنید. بهطور پیشفرض، قفل فایل SFTP غیرفعال است.