教程

手把手教你使用 SFTP 安全地傳輸文件

什麼是 SFTP

在了解 SFTP 之前,我們先看看什麼是 FTPFTP( File Transfer Protocol )文件傳輸協議,是一種常用來在兩終端系統之間傳輸文件的方法。

SFTP ,即 SSH 文件傳輸協議( SSH File Transfer Protocol ),或者說是安全文件傳輸協議( Secure File Transfer Protocol )。SFTP 是一個獨立的 SSH 封裝協議包,通過安全連接以相似的方式工作。它的優勢在於可以利用安全的連接傳輸文件,還能遍曆本地和遠程系統上的文件系統。

在大多數情況下,優先選擇 SFTP 而不是 FTP ,原因在於 SFTP 最基本的安全特性和能利用 SSH 連接的能力。FTP 是一種不安全的協議,應當只有在特定的情況下或者你信任的網路中使用。

雖然 SFTP 集成了很多圖形工具,但是這一篇使用指南會演示如何使用互動式命令行界面來使用它。以下就是使用指南。

 


 

如何使用 SFTP 連接

在默認情況下, SFTP 使用 SSH 協議進行身份驗證並建立安全連接。正因如此,相同的存在於 SSH 中的驗證方法是可用的。

儘管通過默認的方式,使用和設置密碼很方便,我們還是強烈建議你建一個 SSH 密鑰,把你的公鑰傳給你需要訪問的所有系統。長遠來看,這樣會更加安全,也節省你的時間。

如果你還沒有設置 SSH 密鑰,請點擊這裡查看設置 SSH 密鑰指南(後期 LinuxStory 考慮是否翻譯)來設置你的 SSH 密鑰,以便訪問你的伺服器。

如果你能使用 SSH 連接到你的主機上的話,那麼你已經完成所有必要的使用 SFTP 來管理你的文件的要求了。使用下面的命令來測試 SSH 訪問:

ssh username@remote_hostname_or_IP

如果上一條命令成功,輸入這個的命令退出:

exit

建立一個 SSH 連接打開一個 SFTP 會話。這個過程可使用下面命令:

sftp username@remote_hostname_or_IP

這樣,你就連接上遠程系統了,你的提示符也會變為 SFTP 提示符。

在 SFTP 命令行中查看幫助文檔

老規矩,先了解最有用的命令—— help ,它會提供給你 SFTP 的幫助概覽。你可以輸入下面兩個中的任何一個來打開幫助:

help

?

之後,會顯示如下可使用的命令列表:

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'
. . .

接下來,我們會探討以上某些命令。

SFTP Shell 基本操作

我們可以使用大部分類似在本機 Shell 的命令來瀏覽整個目錄結構。

首先,我們要確定當前工作目錄,怎麼確定呢?與大部分的 Shell 會話類似的可以輸入以下命令來獲取當前目錄信息:
pwd

Remote working directory:/home/demouser

另一個熟悉的命令—— ls,查看當前目錄下的內容

ls

Summary.txt    info.txt    temp.txt    testDirectory

值得注意的是, SFTP 的命令行沒有像 Bash 這樣的一般 Shell 功能豐富,只是選擇性的實現了一些重要參數:

ls -la

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
. . .

 

使用下面的命令可以切換到另一個目錄:

cd testDirectory

現在我們就可以遍歷遠程文件系統了!但是如果我們需要訪問本地文件系統,要怎麼辦呢?我們只需要給剛才的這些命令加一個前綴「 l 」( L 的小寫),即可實現對本地主機操作。

到目前為止,我們談到的所有命令都有對應的本地版,我們可以這樣列印出本地主機工作目錄:

lpwd

Local working directory:/Users/demouser

同樣,我們這樣可以列出本機上當前工作目錄的內容:

lls

Desktop			local.txt		test.html
Documents		analysis.rtf		zebra.html

顯然,我們也可以很方便的在一個 Shell 里任意切換本地主機和遠程主機的當前工作目錄:

lcd Desktop

使用 SFTP 傳輸文件

僅僅訪問兩個文件系統之間的內容卻不能在本地和遠程文件系統之間傳輸文件,那簡直就是牛鼎烹雞

下載遠程文件到本地主機

如果我們想從遠程主機上下載文件,跟著我這樣做:

get remote_file_name

Fetching /home/demouser/remoteFile to remote_file_name
/home/demouser/remote_file_name                      100%   37KB  36.8KB/s   00:01

正如你看到的,在默認情況下,「 get 」命令把遠程主機上的文件下載到本地主機而且保證文件名不變。

想改變名字?沒問題!直接指定一個不同的文件名來複制遠程文件即可:

get remote_file_name local_file_name

說到這裡,不得不告訴你,「 get 」命令還有一些可選參數。比如,我們可以打開遞歸選項來遞歸的複製一個文件夾裡面的內容:

get -r some_directory_name

我們還可以打開「 -P 」或者「 -p 」參數來告訴 SFTP 保持文件的許可權訪問位的設置和訪問時間:

get -Pr some_directory_name

上傳本地文件到遠程主機

使用見名知意的「 put 」命令可以很容易的將文件上傳到遠程主機:

put local_file_name

Uploading localFile to /home/demouser/local_file_name
local_file_name                                     100% 7607     7.4KB/s   00:00

" put "具有類似「 get 」的參數。這樣,你可以上傳整個文件夾:

put -r local_directory_name

注意

在目前發布的 Ubuntu 系統(至少是 14.04-15.10 )上運行的 OpenSSH 版本有一個 BUG ,執行以上命令會報錯。使用有BUG 的 OpenSSH 時,在執行上述命令傳輸文件到伺服器上時,會報這樣的錯:Couldn't canonicalise: No such file or directory

要解決這個問題,可以輸入 mkdir local_directory_name 在遠程系統上先新建目標目錄。這樣之後,執行上面的命令應該就不會報錯了。

在我們下載和上傳文件時使用到一個大家熟知而且很有用的工具——「 df 」命令,和其他命令行里工作方式相同。通過它,你可以檢查是否有足夠的空間來完成你想要傳輸的文件:

df -h

 Size     Used    Avail   (root)    %Capacity
 19.9GB   1016MB   17.9GB   18.9GB           4%

請注意!這個命令沒有對應的 ldf ,但我們可以使用「 ! 」這個命令達到相同目的。(說到這裡,想起 LinuxStory 有一篇文章《 Linux 命令行下」 ! 」的十個神奇用法》,很不錯,推薦給沒看到的小夥伴,點擊這裡獲取。)

這個「 ! 」(半形嘆號)命令把我們帶回到本地 Shell ,在這裡可以運行所有在我們本地系統可用的命令。通過輸入下面命令來檢查我們的硬碟使用情況:

!
df -h

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 提示符又回來了

其實還可以不退出 SFTP Shell 執行本地主機命令,如果你在 VIM 裡面執行過 Shell 指令,我想你應該明白什麼意思。

使用 SFTP 進行簡單的文件操作

SFTP 允許你執行基本的文件維護類型,在有文件系統的時候很有用。

例如,你可以使用下面命令更改遠程系統上的文件所有者:

chown userID file

請注意,和系統「 chmod 」命令不同,這個 SFTP 命令不接受用戶名,取而代之的是用戶的 UID 。不幸的是,沒有簡便的方法通過 SFTP 介面得到相應的 UID 。

這個棘手的問題可以使用這個命令解決:

get /etc/passwd
!less passwd

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
. . .

請注意,是「 ! 」而不是「 l 」,這和之前的「 l 」前綴不一樣,使用它我們可以像在 VIM 裡面一樣的方式執行本地 Shell 指令。之前就已經在本地「 df 」命令上使用過。

UID 會出現在文件中的第三列,通過冒號界定。

同樣,我們可以更改文件屬組:

chgrp groupID file

再次提醒,想要得到遠程系統的 GID 也不是那麼簡單的。我們可以用同樣的方式來解決:

get /etc/group
!less group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .

顯然我們可以看到第三列就是對應第一列用戶所在組的 GID 。這就是我們要找的東西!
幸運的是,這個「 chmod 」命令可以在遠程文件系統上執行這樣的指令:
chmod 777 publicFile

Changing mode on /home/demouser/publicFile

雖然沒有現成的命令來操作本地文件許可權,但是你可以設置本地的 umask 。這樣,任何複製到本地系統的文件都有相應的許可權。

使用「 lumask 」命令來完成這個操作:
lumask 022
Local umask: 022

現在所有的常規文件下載(只要沒有打開「 -p 」參數)都會有 644 許可權。

SFTP 允許你在本地文件系統和遠程文件系統上新建目錄,分別使用 " lmkdir " 和 " mkdir "命令,這絕對有用!

這剩下的文件命令就只有針對遠程文件系統的了:

ln
rm
rmdir

這些命令複製 Shell 版本的基本特性。如果你需要在本地文件系統執行這些操作,請記住,你可以輸入這個命令切換至 Shell :
!
或者在本地系統執行這一個加「 ! 」前綴的命令,像這樣:

!chmod 644 somefile

當你完成了 SFTP 會話,使用「 exit 」或者「 bye 」來關閉連接:
bye

總結

雖然 SFTP 是一個很簡單的工具,但用它來管理伺服器並在客戶端與伺服器之間傳輸文件是非常方便的。

如果你習慣使用 FTP 或者 SCP 來實現你的傳輸,那麼,你可以試試 SFTP ,它集兩家之所長。雖然它不是在所有的情況下都如你所願,但它是一個靈活的工具,值得加入你的技能庫!

By Justin Ellingwood

原文鏈接:https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server

譯文鏈接: http://www.linuxstory.org/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server/

對這篇文章感覺如何?

太棒了
7
不錯
2
愛死了
0
不太好
0
感覺很糟
0
喜歡謀略,善良有愛心;愛古裝劇,追求劇中的江湖義氣和兄弟情義。一身男兒義氣,卻又缺點男兒俠氣!常以萌妹子角色混跡江湖!

    You may also like

    1 Comment

    1. […] 手把手教你使用 SFTP 安全地傳輸文件 | Linux Story […]

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:教程

    教程

    在 Ubuntu Linux 上安裝 Clang

    無論您使用的是 Ubuntu 22.04、20.04 或其他任何版本,並且想要安裝 Clang(一個開源的 C、C++ 和 Objective-C 編譯器),本文將對您有所幫助。Clang 是 GNU […]