手把手教你使用 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 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/
[…] 手把手教你使用 SFTP 安全地傳輸文件 | Linux Story […]