ホームページ > 記事 > システムチュートリアル > Linux で SCP を使用してファイルを安全に転送する方法
ネットワーク上のファイル転送は、さまざまな方法やプロトコルを通じて実行できます。ファイルをリモートでコピーするための最も一般的なプロトコルは、Rsync、SCP、および SFTP です。この記事では、SCP とは何か、また Linux や Unix 系オペレーティング システムで SCP を使用してローカル コンピューターとリモート コンピューター間でファイルを安全に転送する方法について説明します。
SCPとは何ですか?
SCP (Secure Copy の略) は、Linux や Unix のようなオペレーティング システムで安全な方法で、ローカル システムとリモート システム間、または 2 つのリモート システム間でファイルをコピーするコマンド ライン プログラムです。
scp コマンドを使用すると、ファイルまたはディレクトリを安全にコピーできます:
◈ リモート システムからローカルへ
◈ 2 つのリモート システム間
scp コマンドを使用してデータを転送すると、ファイルとディレクトリが暗号化されます。したがって、たとえネットワークが侵害されたとしても、加害者は意味のあるデータを取得することはできません。
リマインダー:
openSSH 開発者からの公式発表によると:
#「さらに、SCP は」 scp プロトコルは時代遅れで、柔軟性に欠けており、修正するのは簡単ではありません。代わりに、
sftpや
」rsync
などのより新しいプロトコルを使用することをお勧めします。参考 – https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html
#しかし、ほとんどのユーザーは依然として SCP プロトコルを好みます。これは、SCP がピアの SFTP や Rsync よりも高速にリモート ファイル転送を処理するためです。
cp
コマンドとまったく同じように機能しますが、rsync はソース ディレクトリの末尾にスラッシュがあるかどうかを判断し、動作が異なります。次のコマンドを見てください:
◈
rsync ソース宛先/
source ディレクトリを
destination フォルダーにコピーします。
◈
rsync source/ destination/
source ディレクトリの内容を
destination フォルダーにコピーします。
したがって、パスにスラッシュを追加したかどうかを再確認する必要があります。
SCP コマンド構文
SCP の一般的な構文は次のとおりです:
リーリー
構文はファイル転送パスによって異なります。ここでは、構文形式の例をいくつかリストしました。ファイルをローカル システムからリモート システムにコピーします:
scp SourceFile User@RemoteHost:RemotePath
类似的,从本地系统复制一个目录到远程系统,使用 -r
参数:
scp -r SourceDirectory User@RemoteHost:RemotePath
复制多个文件到远程系统:
scp SourceFile1 SourceFile2 User@RemoteHost:RemotePath
远程系统复制文件到本地:
scp User@RemoteHost:RemoteFilePath DestinationFile
远程系统复制目录到本地:
scp -r User@RemoteHost:RemoteDirectoryPath DestinationDirectory
在本地将文件在两个远程系统之间复制:
scp User@RemoteHost1:RemoteFile1 User@RemoteHost2:RemotePath
注意,当你在两个远程系统之间复制文件时,流量不会通过本地系统。操作直接在两个远程系统之间进行。但是,你可以使用 -3
参数让流量经过你运行 scp
命令的系统。
从你的本地系统将一个远程系统的目录复制到另一个远程系统:
scp -r User@RemoteHost1:RemoteDirectory User@RemoteHost2:DestinationPath
SCP 命令参数
SCP 命令最常用的参数有:
◈ -C
:启用压缩。C
代表 压缩(Compression)。使用此参数时,数据传输速度会更快,因为数据是压缩的。SCP 将自动在源系统上压缩,并在目标系统上解压缩。
◈ -c <cipher></cipher>
:c
代表 加密(Cipher)。默认情况下,SCP 使用 AES-128 加密方法对数据进行加密。你可以使用 -c
参数更改加密方法。
◈ -i <identity_file></identity_file>
:i
代表 身份(Identity) 文件或私钥。如你所知,SSH 中使用基于密码或密钥的身份验证。如果希望在传输文件时使用基于密钥的身份验证,可以使用 -i
参数指定身份文件或私钥。
◈ -l limit
:l
代表 限制(Limit) 带宽。通过此参数,可以设置传输数据的最大带宽。它的单位是 Kbit/s
。
◈ -F <ssh_config></ssh_config>
:有时你可能需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器,这种情况下,你可以使用 -F
参数使用不同的 ssh_config
文件(File)。
◈ -P port
:P
代表 埠(Port)。注意,這是大寫的 P
。預設情況下,SSH 使用連接埠 22。但出於安全原因,你可能已經更改了目標主機中的連接埠號碼。在這種情況下,你應該使用 -P
參數顯示指定新連接埠號碼。
◈ -p
:如果希望 保留(Preserve) 原始檔案的修改時間、存取時間和模式,你需要使用 -p
參數。注意是小寫 p
。
◈ -r
:遞歸(Recursively) 複製整個目錄。
◈ -B
:B
代表 批次(Batch) 模式。它用於在傳輸檔案時選擇批次模式。可以防止詢問密碼。
◈ -S program
:用於加密連線的 程式(Program) 名稱。
◈ -v
:v
代表 詳細(Verbose)。當使用 -v
參數時,指令將會在終端機畫面上列印進度。你會看到文件傳輸時到底發生了什麼事。它在調試連接、身份驗證和配置問題時非常有用。
SCP 有很多參數,你可以查看它的手冊頁來了解其他參數。讓我們來看一些有用的 scp 指令範例。
開始前要記住的重要事項
◈ scp
指令依賴 ssh
進行安全的檔案傳輸。因此,你必須有一個 ssh 金鑰或密碼才能向遠端系統進行身份驗證。
◈ 為了能傳輸文件,你必須對來源文件有讀取權限,對目標位置有寫入權限。
◈ scp
指令在寫入前不會檢查目標位置。目標位置中具有相同名稱的任何檔案都將被覆蓋而不通知。
◈ 為了能夠區分本地和遠端位置,使用冒號(:
)。
◈ 傳輸大檔案時,建議在 Screen🔗 ostechnix.com 或 Tmux🔗 ostechnix.com 會話內啟動任務。
在 Linux 中使用 SCP 傳輸檔案
正如我所说,我们可以使用 scp
命令将文件或目录从本地复制到远程系统,反之亦然,或者在两台远程系统之间复制文件或目录。
\1. 使用 SCP 从本地系统复制文件到远程系统
使用 scp
命令将文件从本地复制到远程系统,运行:
$ scp File1.txt ostechnix@192.168.1.40:/home/ostechnix/
示例输出:
ostechnix@192.168.1.40'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's password:File1.txt 100% 104 689.4KB/s 00:00File2.txt 100% 496 6.3MB/s 00:00
从本地复制多个文件到远程系统
这里:
◈ File1.txt
和 File2.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.txt
和 File2.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.txt
到 192.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 协议的默认端口🔗 ostechnix.com。这种情况下,你可以在传输文件时使用 -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/directoryscp {file1,file2,file3}.txt User@RemoteHost:/some/remote/directoryscp *.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 安全地复制文件将是非常有用的。
以上がLinux で SCP を使用してファイルを安全に転送する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。