صبحانه کاری برای شروع رفاقت های کاری و تخصصی

آموزش استفاده از SFTP برای انتقال ایمن فایل‌ها با سرور راه‌ دور

Avatar
نویسنده: پارسا مهرآئین
جمعه 13 خرداد 1401
مطالعه: ۱۱ دقیقه ۰ نظر ۲۰۶۹ بازدید

پروتکل انتقال فایل یا 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

چگونه به 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 و موارد استفاده‌ی آن‌ها

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

نحوه دانلود از 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

انتقال فایل‌ها با 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

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 غیرفعال است.