Linux中國

如何在 Linux 中使用 SCP 安全地傳輸文件

在網路上文件傳輸可以通過各種不同的方式和協議來完成。遠程複製文件最常用的協議是 RsyncSCPSFTP。在本文中,我們將了解什麼是 SCP 以及如何在 Linux 和類 Unix 操作系統中使用 SCP 在本地和遠程計算機之間安全地傳輸文件

什麼是 SCP?

SCP,代表 安全複製 Secure Copy ,它是一個命令行程序,在 Linux 和類 Unix 操作系統中以安全的方式在本地和遠程系統之間,或在兩個遠程系統之間複製文件和目錄。

使用 scp 命令,你可以安全地複製文件或目錄:

  • 從本地到遠程系統
  • 從遠程系統到本地
  • 在兩個遠程系統之間

使用 scp 命令傳輸數據時,文件和目錄都是加密的。因此,即使網路被破壞,作惡者也無法獲得任何有意義的數據。

SCP 是 openSSH 程序的一個組件,它使用 SSH 協議安全地傳輸文件。幾乎所有現代 Linux 和 Unix 發行版都預裝了 OpenSSH,所以不必費心安裝它。

提醒一句:

根據 openSSH 開發人員的官方公告

scp 協議已經過時了,它不靈活且不易修復。我們建議使用更現代的協議,如 sftprsync 來代替。

參考 - https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html

但是,大多數用戶仍然更喜歡 SCP 協議。因為,SCP 處理遠程文件傳輸比同行 SFTP 和 Rsync 更快。

另外,SCP 的工作原理與 cp 命令完全相同,而 rsync 則會判斷源目錄是否有結尾斜杠而出現不同的行為。看一看下面的命令:

  • rsync source destination/ - 將 source 目錄複製到 destination 文件夾內。
  • rsync source/ destination/ - 將 source 目錄的內容複製到 destination 文件夾中。

所以,你必須反覆檢查是否在路徑中添加了斜杠。

我個人使用 Rsync 在兩台主機之間複製大文件,使用 SCP 在網路上複製單個文件。

SCP 命令語法

SCP 的通用語法如下:

scp [-346ABCpqrTv] [-c cipher] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ... target

根據文件傳輸路徑的不同,語法也會有所不同。這裡我羅列了一些語法格式示例。

從本地複製一個文件到遠程系統:

scp <options> SourceFile User@RemoteHost:RemotePath

類似的,從本地系統複製一個目錄到遠程系統,使用 -r 參數:

scp -r SourceDirectory User@RemoteHost:RemotePath

複製多個文件到遠程系統:

scp <options> SourceFile1 SourceFile2 User@RemoteHost:RemotePath

遠程系統複製文件到本地:

scp <options> User@RemoteHost:RemoteFilePath DestinationFile

遠程系統複製目錄到本地:

scp -r User@RemoteHost:RemoteDirectoryPath DestinationDirectory

在本地將文件在兩個遠程系統之間複製:

scp <options> User@RemoteHost1:RemoteFile1 User@RemoteHost2:RemotePath

注意,當你在兩個遠程系統之間複製文件時,流量不會通過本地系統。操作直接在兩個遠程系統之間進行。但是,你可以使用 -3 參數讓流量經過你運行 scp 命令的系統。

從你的本地系統將一個遠程系統的目錄複製到另一個遠程系統:

scp -r User@RemoteHost1:RemoteDirectory User@RemoteHost2:DestinationPath

SCP 命令參數

SCP 命令最常用的參數有:

  • -C:啟用壓縮。C 代表 壓縮 Compression 。使用此參數時,數據傳輸速度會更快,因為數據是壓縮的。SCP 將自動在源系統上壓縮,並在目標系統上解壓縮。
  • -c <cipher>c 代表 加密 Cipher 。默認情況下,SCP 使用 AES-128 加密方法對數據進行加密。你可以使用 -c 參數更改加密方法。
  • -i <identity_file>i 代表 身份 Identity 文件或私鑰。如你所知,SSH 中使用基於密碼或密鑰的身份驗證。如果希望在傳輸文件時使用基於密鑰的身份驗證,可以使用 -i 參數指定身份文件或私鑰。
  • -l limitl 代表 限制 Limit 帶寬。通過此參數,可以設置傳輸數據的最大帶寬。它的單位是 Kbit/s
  • -F <ssh_config>:有時你可能需要使用不同的網路來連接到 Linux 系統,或你有一個代理伺服器,這種情況下,你可以使用 -F 參數使用不同的 ssh_config 文件 File
  • -P portP 代表 Port 。注意,這是大寫的 P。默認情況下,SSH 使用埠 22。但出於安全原因,你可能已經更改了目標主機中的埠號。這種情況下,你應該使用 -P 參數顯示指定新埠號。
  • -p:如果希望 保留 Preserve 原始文件的修改時間、訪問時間和模式,你需要使用 -p 參數。注意是小寫 p
  • -r 遞歸 Recursively 複製整個目錄。
  • -BB 代表 批處理 Batch 模式。它用於在傳輸文件時選擇批處理模式。可以防止詢問密碼。
  • -S program:用於加密連接的 程序 Program 名稱。
  • -vv 代表 詳細 Verbose 。當使用 -v 參數時,命令將會在終端屏幕上列印進度。你會看到文件傳輸時到底發生了什麼。它在調試連接、身份驗證和配置問題時非常有用。

SCP 有很多參數,你可以查看它的手冊頁來了解其他參數。讓我們看一些有用的 scp 命令示例

開始前要記住的重要事項

  • scp 命令依賴於 ssh 進行安全的文件傳輸。因此,你必須有一個 ssh 密鑰密碼才能向遠程系統進行身份驗證。
  • 為了能傳輸文件,你必須對源文件有讀許可權,對目標位置有寫許可權
  • scp 命令在寫入前不會檢查目標位置。目標位置中具有相同名稱的任何文件都將被覆蓋而不通知
  • 為了能夠區分本地和遠程位置,使用冒號:)。
  • 傳輸大文件時,建議在 ScreenTmux 會話內啟動任務。

在 Linux 中使用 SCP 傳輸文件

正如我所說,我們可以使用 scp 命令將文件或目錄從本地複製到遠程系統,反之亦然,或者在兩台遠程系統之間複製文件或目錄。

1. 使用 SCP 從本地系統複製文件到遠程系統

使用 scp 命令將文件從本地複製到遠程系統,運行:

$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/

示例輸出:

ostechnix@192.168.1.40&apos;s password: 
File1.txt                                                    100%  104   814.0KB/s   00:00

讓我們分析一下上面的命令,看看每個參數都做了什麼。

  • File1.txt - 源文件
  • ostechnix - 遠程系統的用戶名
  • 192.168.1.40 - 遠程系統的 IP 地址
  • /home/ostechnix/ - 遠程系統中的目標目錄。這是我們想要傳輸源文件的絕對路徑,如 File.txt

你還可以修改目標文件的名稱。下面的命令將 File1.txt 傳輸到目的地,保存為 myfile.txt

$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/myfile.txt

將文件從本地複製到遠程系統

2. 使用 SCP 從本地系統複製多個文件到遠程系統

使用 scp 命令將多個文件從本地系統傳輸到遠程系統,運行:

$ scp File1.txt File2.txt ostechnix@192.168.1.40:/home/ostechnix/

示例輸出:

ostechnix@192.168.1.40&apos;s password: 
File1.txt                                                    100%  104   689.4KB/s   00:00    
File2.txt                                                    100%  496     6.3MB/s   00:00

從本地複製多個文件到遠程系統

這裡:

  • File1.txtFile2.txt - 源文件名
  • ostechnix@192.168.1.40 - 遠程系統的用戶名和 IP 地址
  • /home/ostechnix - 目標文件的路徑

如果文件具有相同的擴展名,你可以使用以下替代命令來實現相同的目標。

$ scp {File1,File2}.txt ostechnix@192.168.1.40:/home/ostechnix/

或者,

$ scp *.txt ostechnix@192.168.1.40:/home/ostechnix/

3. 使用 SCP 從本地到遠程系統遞歸複製目錄

遞歸地將整個目錄(包括子目錄及其內容)從本地複製到遠程系統,使用 -r 參數。

$ scp -r Documents/ ostechnix@192.168.1.40:/home/ostechnix/

從本地複製目錄到遠程系統

上述命令將整個 Documents 目錄包括其內容複製到目標系統。

其中,

  • -r - 遞歸複製文件和目錄,包括子目錄及其內容
  • Documents - 源目錄名稱
  • ostechnix@192.168.1.40 - 遠程系統的用戶名和 IP 地址
  • /home/ostechnix - 目標目錄的路徑

4. 用 SCP 將文件從遠程系統傳輸到本地

還記得我們從本地系統複製了 File1.txt 到遠程系統,讓我們把它複製回本地。

使用 scp 命令從遠程系統複製文件到本地,運行:

$ scp ostechnix@192.168.1.40:/home/ostechnix/File1.txt Downloads/

其中

  • ostechnix@192.168.1.40 - 遠程系統的用戶名和 IP 地址
  • /home/ostechnix/File.txt - 遠程系統文件的絕對路徑
  • Downloads - 本地保存複製文件的位置

從遠程系統傳輸文件到本地

5. 使用 SCP 將多個文件從遠程系統傳輸到本地

將多個文件從遠程系統複製到本地,在花括弧內註明文件的絕對路徑,如下所示:

$ scp ostechnix@192.168.1.40:/home/ostechnix/{File1.txt,File2.txt} Downloads/

將多個文件從遠程系統傳輸到本地

上述命令將從遠程系統的 /home/ostechnix/ 目錄中複製 File1.txtFile2.txt 到本地的 Downloads 目錄中。

注意,花括弧內的逗號後面沒有空格

6. 從遠程系統遞歸複製目錄到本地

使用 scp 從遠程系統遞歸複製整個目錄(包括子目錄及其內容)到本地系統,使用 -r 參數。

$ scp -r ostechnix@192.168.1.40:/home/ostechnix/Documents Downloads/

上述命令將從遠程系統將整個 Documents 目錄複製到本地的 Downloads 目錄。

7. 使用 SCP 在兩台遠程計算機之間複製文件

使用 scp 命令將文件從一個遠程系統直接複製到另一個遠程系統,運行:

$ scp senthil@192.168.1.40:/home/senthil/File1.txt kumar@192.168.1.20:/home/kumar/

它會要求你輸入兩個遠程系統的密碼:

其中,

  • senthil@192.168.1.40 - 文件源端遠程系統的用戶名和 IP 地址
  • /home/senthil/File1.txt - 複製的文件名及其位置
  • kumar@192.168.1.20 - 複製文件到目標端的用戶名和 IP 地址
  • /home/kumar - 在目標端上保存複製文件的位置

上述命令將從遠程主機 192.168.1.40 複製 /home/senthil/File1.txt192.168.1.20 上的 /home/kumar/ 目錄。

在這種方法中,數據將直接從一個遠程系統傳輸到另一個遠程系統。如果你想通過本地機器路由流量,使用 -3 參數,如下所示:

$ scp -3 senthil@192.168.1.40:/home/senthil/File1.txt kumar@192.168.1.20:/home/kumar/

8. 使用 SCP 複製文件時啟用壓縮

到目前為止,我們在沒有壓縮的情況下傳輸了文件。現在我們將使用 -C 參數在傳輸文件時啟用壓縮。

$ scp -C File1.txt ostechnix@192.168.1.40:/home/ostechnix/

-C 參數將在源端啟用壓縮,並在目標端自動解壓數據。

通過啟用壓縮,可以顯著提高文件複製或傳輸速度。

9. 使用 SCP 傳輸文件時限制帶寬

我們可以使用 -l 參數限制帶寬。注意,最大帶寬單位為 Kbits/s。1 Byte = 8 bit。因此,如果你想將帶寬限制在 200KB/s,-l 的值將是 1600(200*8)。

$ scp -l 1600 File1.txt ostechnix@192.168.1.40:/home/ostechnix/

這在傳輸大文件時非常有用,可以防止 SCP 限制帶寬。

10. 使用 SCP 複製文件時使用不同埠

作為系統管理員,出於安全原因,你可能在遠程伺服器上 更改了 SSH 協議的默認埠。這種情況下,你可以在傳輸文件時使用 -P 參數指定埠號。注意:大寫的 P

$ scp -P 2022 File1.txt ostechnix@192.168.1.40:/home/ostechnix/

11. 使用 SCP 複製文件時使用不同的加密方法

默認情況下,SCP 使用 AES-128 對文件進行加密。如果你想使用不同的加密方法,使用 c 參數。

例如,如果你想使用 3des-cbc 加密方法,命令如下所示:

$ scp -c 3des-cbc File1.txt ostechnix@192.168.1.40:/home/ostechnix/

要查看支持的密碼列表,執行:

$ ssh -Q cipher localhost | paste -d, -s -

示例輸出:

3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com

12. 在詳細模式下使用 SCP 複製文件

如果你想知道使用 scp 複製文件時幕後發生了什麼,你可以使用 -v 參數。使用詳細模式傳輸文件時,終端上會顯示執行 scp 命令執行的每一步過程。這在故障排除時很方便。

$ scp -v File1.txt ostechnix@192.168.1.40:/home/ostechnix/

在詳細模式下發送文件時,你將看到大量輸出,如下所示:

在詳細模式下使用 SCP 複製文件

13. 在安靜模式下使用 SCP 傳輸文件

我們可以使用 -q 參數在安靜模式下傳輸文件。在安靜模式下共享文件時,不會在輸出中顯示進度、警告或診斷信息。

$ scp -q File1.txt ostechnix@192.168.1.40:/home/ostechnix/

14. 使用 SCP 傳輸文件時保留文件屬性

使用 -p 參數可以保留文件修改時間、訪問時間和模式等文件屬性。注意,這是小寫的 p

$ scp -p File1.txt ostechnix@192.168.1.40:/home/ostechnix/

15. 使用 SCP 複製文件時使用身份文件

SSH 同時支持基於密碼和密鑰的身份驗證。密鑰是 Linux 環境中使用最廣泛的身份驗證方法。

如果你想在傳輸文件時使用基於密鑰的身份驗證,使用 -i 參數指定身份文件或私鑰。

$ scp -i my_private_key.pem File1.txt ostechnix@192.168.1.40:/home/ostechnix/

16. 使用不同的 ssh 配置文件

在某些情況下,你需要使用不同的網路來連接到 Linux 系統,或你有一個代理伺服器。這在情況下,你可以配合 -F 參數使用不同的 ssh_config 文件。

$ scp -F /home/ostechnix/my_ssh_config File1.txt ostechnix@192.168.1.40:/home/ostechnix/

17. 使用 IPv4 或 IPv6 複製文件

在複製文件時,我們可以強制 SCP 只使用 IPv4 或 IPv6 地址。IPv4 網路添加 -4 參數,IPv6 網路添加 -6 參數可以實現這一點。

$ scp -6 File1.txt ostechnix@192.168.1.40:/home/ostechnix/

常見問題

問題 1:什麼是 SCP?

SCP 是一個命令行程序,旨在將文件和目錄從本地系統安全地傳輸到遠程系統,反之亦然,或者直接在兩個遠程系統之間傳輸。

問題 2: 如何使用 SCP 將文件從本地複製到遠程計算機?

將文件從本地複製到遠程系統,命令如下:

scp SourceFile.txt User@RemoteHost:/some/remote/directory

問題 3:如何遞歸複製文件和目錄?

遞歸複製包含子目錄的目錄,使用 -r 參數:

scp -r /some/local/directory User@RemoteHost:/some/remote/directory

問題 4:使用 SCP 可以傳輸多個文件嗎?

當然,只要用空格分隔源文件名即可。

從本地複製多個文件到遠程:

scp file1.txt file2.txt file3.txt User@RemoteHost:/some/remote/directory
scp {file1,file2,file3}.txt User@RemoteHost:/some/remote/directory
scp *.txt User@RemoteHost:/some/remote/directory

從遠程複製多個文件到本地:

scp User@RemoteHost:/some/remote/directory/{file1.txt,file2.txt,file3.txt} /some/local/directory

從一個遠程系統複製多個文件到另一個遠程系統:

$ scp User@RemoteHost1:/some/remote/directory/{file1.txt,file2.txt,file3.txt} User@RemoteHost2:/some/remote/directory/

問題 5:如何傳輸目錄下的所有文件?

傳輸整個目錄,首先進入該目錄:

cd dir_name

然後,

scp *.txt User@RemoteHost:/some/remote/directory

問題 6:可以壓縮文件嗎?

當然。使用 -C 壓縮文件。文件會在源端壓縮,在目標端自動解壓縮。

scp -C /some/large/file User@RemoteHost:/some/remote/directory

問題 7:可以保留文件屬性嗎?

保留原始文件的修改時間、訪問時間和模式等文件屬性,使用 -p 參數。

scp -p file.txt User@RemoteHost:/some/remote/directory

問題 8: 可以使用其他埠嗎?

當然。SCP 配合 -P 參數允許你使用其他埠。

scp -P 2022 file.txt User@RemoteHost:/some/remote/directory

問題 9: 可以使用不同的加密方法嗎?

當然。使用 -c 參數。

scp -c 3des-cbc User@RemoteHost:/some/remote/directory

問題 10: 如何列出 SSH 支持的加密方法?

使用以下命令查看 SSH 和 SCP 支持的加密方法列表:

ssh -Q cipher localhost | paste -d, -s -

問題 11:SCP 真的安全嗎?

當然,它用起來是完全安全的。SCP 和 openSSH 使用相同的 SSH 機制。傳輸的數據在源端加密,目標端解密。

問題 12:可以從 Windows 系統傳輸文件到 Linux 嗎?

當然。使用 PSCP 程序將文件從 windows 傳輸到 Linux 平台,你也可以使用 WinSCP

總結

在這篇全面指南中,我們了解了什麼是 SCP,以及如何在 Linux 中使用 SCP 安全地傳輸文件,其中包括 17 個 SCP 命令示例,另外還回答了關於 SCP 的常見問題。

無論你是 Linux 管理人員、開發人員還是普通用戶,你都會面臨某個時候將文件複製到遠程系統或從遠程系統複製文件的情況,知道如何使用 SCP 安全地複製文件將是非常有用的。

via: https://ostechnix.com/securely-transfer-files-with-scp-in-linux/

作者:sk 選題:lkxed 譯者:MjSeven 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

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

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

    More in:Linux中國