1. 程式人生 > >使用 SFTP 安全地傳輸檔案---轉載

使用 SFTP 安全地傳輸檔案---轉載

什麼是 SFTP ?
在瞭解 SFTP 之前,我們先看看什麼是 FTP 。FTP( 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 [email protected]_hostname_or_IP

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

exit

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

sftp [email protected]_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'
<span class='wp_keywordlink_affiliate'><a href="https://linuxstory.org/tag/df/" title="View all posts in df" target="_blank">df</a></span> [-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'
. . .

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

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

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

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

Changing mode on /home/demouser/publicFile

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

使用“ lumask ”命令來完成這個操作:

lumask 022
Local umask: 022

現在所有的常規檔案下載(只要沒有開啟“ -p ”引數)都會有 644 許可權。

SFTP 允許你在本地檔案系統和遠端檔案系統上新建目錄,分別使用 ” lmkdir ” 和 ” mkdir “命令,這絕對有用!

這剩下的檔案命令就只有針對遠端檔案系統的了:

ln
rm
rmdir
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/