在网络上文件传输可以通过各种不同的方式和协议来完成。远程复制文件最常用的协议是Rsync、SCP和SFTP。在本文中,我们将了解什么是 SCP以及如何在 Linux 和类 Unix 操作系统中使用 SCP 在本地和远程计算机之间安全地传输文件。
什么是 SCP?
SCP,代表安全复制(Secure Copy),它是一个命令行程序,在 Linux 和类 Unix 操作系统中以安全的方式在本地和远程系统之间,或在两个远程系统之间复制文件和目录。
使用scp命令,你可以安全地复制文件或目录:
◈从本地到远程系统
◈从远程系统到本地
◈在两个远程系统之间
使用scp命令传输数据时,文件和目录都是加密的。因此,即使网络被破坏,作恶者也无法获得任何有意义的数据。
SCP 是 openSSH 程序的一个组件,它使用 SSH 协议安全地传输文件。几乎所有现代 Linux 和 Unix 发行版都预装了 OpenSSH,所以不必费心安装它。
提醒一句:
根据 openSSH 开发人员的官方公告:
scp 协议已经过时了,它不灵活且不易修复。我们建议使用更现代的协议,如sftp和rsync来代替。
但是,大多数用户仍然更喜欢 SCP 协议。因为,SCP 处理远程文件传输比同行 SFTP 和 Rsync 更快。
另外,SCP 的工作原理与cp命令完全相同,而rsync则会判断源目录是否有结尾斜杠而出现不同的行为。看一看下面的命令:
◈rsync source destination/- 将source目录复制到destination文件夹内。
◈rsync source/ destination/- 将source目录的内容复制到destination文件夹中。
所以,你必须反复检查是否在路径中添加了斜杠。
我个人使用Rsync ostechnix.com在两台主机之间复制大文件,使用 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
类似的,从本地系统复制一个目录到远程系统,使用-r参数:
scp -r SourceDirectory User@RemoteHost:RemotePath
复制多个文件到远程系统:
scp
远程系统复制文件到本地:
scp
远程系统复制目录到本地:
scp -r User@RemoteHost:RemoteDirectoryPath DestinationDirectory
在本地将文件在两个远程系统之间复制:
scp
注意,当你在两个远程系统之间复制文件时,流量不会通过本地系统。操作直接在两个远程系统之间进行。但是,你可以使用-3参数让流量经过你运行scp命令的系统。
从你的本地系统将一个远程系统的目录复制到另一个远程系统:
scp -r User@RemoteHost1:RemoteDirectory User@RemoteHost2:DestinationPath
SCP 命令参数
SCP 命令最常用的参数有:
SCP 有很多参数,你可以查看它的手册页来了解其他参数。让我们看一些有用的 scp 命令示例。
开始前要记住的重要事项
在 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:00
File2.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目录包括其内容复制到目标系统。
其中,
4. 用 SCP 将文件从远程系统传输到本地
还记得我们从本地系统复制了File1.txt到远程系统,让我们把它复制回本地。
使用scp命令从远程系统复制文件到本地,运行:
$ scp ostechnix@192.168.1.40:/home/ostechnix/File1.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/
它会要求你输入两个远程系统的密码:
其中,
上述命令将从远程主机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/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 安全地复制文件将是非常有用的。
审核编辑:刘清
-
Linux
+关注
关注
87文章
11322浏览量
209869 -
UNIX操作系统
+关注
关注
0文章
13浏览量
15322 -
SSH
+关注
关注
0文章
189浏览量
16359 -
SCP
+关注
关注
0文章
29浏览量
9268
原文标题:如何在 Linux 中使用 SCP 安全地传输文件
文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论