Linux 中使用 SCP 命令安全复制文件

SCP 是 linux 发行版中的命令行工具,用于通过网络安全地跨系统复制文件和目录。SCP 代表安全复制,因为它使用 ssh 协议复制文件。

拷贝时,scp 命令建立 ssh 连接到远程系统。换句话说,我们可以说 scp 在后端使用相同的 SSH 安全机制,它需要密码或密钥进行身份验证。

SCP 命令语法

从本地系统复制到远程主机

scp <options> <files_or_directories> user@target_host:/<folder>

从远程主机复制到本地系统

scp <options> user@target_host:/files <folder_local_system>

下面列出了 scp 命令中使用最广泛的一些选项

  • -C 启用压缩
  • -i 身份文件或私钥
  • -l 复制时限制带宽
  • -P 目标主机 SSH 端口号
  • -p 在复制时保留文件的权限、模式和访问时间
  • -q 禁止显示 SSH 的警告消息
  • -r 递归复制文件和目录
  • -v 详细输出

1) 从本地复制文件到远程

假设我们要将 jdk rpm 包从本地 Linux 系统复制到远程系统 (172.20.10.8) /opt 目录下

$ scp jdk-linux-x64_bin.rpm root@172.20.10.8:/opt
root@172.20.10.8's password:
jdk-linux-x64_bin.rpm 100% 10MB 27.1MB/s 00:00
$

2) 从远程复制文件到本地

Suppose we want to copy a file from remote system to our local system under the /tmp folder, execute the following,

假设我们要将文件从远程复制到本地 /tmp 目录下

$ scp root@172.20.10.8:/root/Technical-Doc-RHS.odt /tmp
root@172.20.10.8's password:
Technical-Doc-RHS.odt 100% 1109KB 31.8MB/s 00:00
$ ls -l /tmp/Technical-Doc-RHS.odt
-rwx------. 1 pkumar pkumar 1135521 Oct 19 11:12 /tmp/Technical-Doc-RHS.odt
$

3) 复制文件时详细输出

我们可以在复制文件时使用 -v 选项启用详细输出。使用详细输出,我们可以很容易地发现后台到底发生了什么。这在调试连接、身份验证和配置问题时非常有用。

$ scp -v jdk-linux-x64_bin.rpm root@172.20.10.8:/opt
Executing: program /usr/bin/ssh host 172.20.10.8, user root, command scp -v -t /opt
OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS 11 Sep 2018
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug1: /etc/ssh/ssh_config.d/05-redhat.conf line 8: Applying options for *
debug1: Connecting to 172.20.10.8 [172.20.10.8] port 22.
debug1: Connection established.
…………
debug1: Next authentication method: password
root@172.20.10.8's password:

4) 复制多个文件到远程

使用 scp 命令可以一次性拷贝多个文件到远程。指定以空格分隔多个文件,示例如下

$ scp install.txt index.html jdk-linux-x64_bin.rpm root@172.20.10.8:/mnt
root@172.20.10.8's password:
install.txt 100% 0 0.0KB/s 00:00
index.html 100% 85KB 7.2MB/s 00:00
jdk-linux-x64_bin.rpm 100% 10MB 25.3MB/s 00:00
[pkumar@linuxtechi ~]$

5) 跨两个远程系统复制文件

使用 scp 命令,我们可以在两个远程主机之间复制文件和目录,假设我们有一个本地 Linux 系统,它可以连接到两个远程 Linux 系统,那么从我的本地系统,我可以使用 scp 命令在这两个系统之间复制文件,语法如下:

$scp user@remote_hosts1:/<files_to_transfer> user@remote_host2:/<folder>

示例如下所示:

$ scp pkumar@172.20.10.9:~/backup-Oct.zip root@172.20.10.8:/tmp
$ ssh root@172.20.10.8 "ls -l /tmp/backup-Oct.zip"
-rwx------. 1 root root 747438080 Oct 19 12:02 /tmp/backup-Oct.zip

6) 递归复制文件和目录

在 scp 命令中使用 -r 选项递归地将整个目录从一个系统复制到另一个系统,示例如下

$ scp -r Downloads root@172.20.10.8:/opt

使用以下命令验证下载文件夹是否复制到远程系统

$ ssh root@172.20.10.8 "ls -ld /opt/Downloads"
drwxr-xr-x. 2 root root 75 Oct 19 12:10 /opt/Downloads
$

7) 通过启用压缩来增加拷贝速度

我们可以通过使用 -C 选项启用压缩来增加传输或复制速度,它将自动在源处启用压缩并在目标处解压缩。

假设我们需要递归传输 Downlod 目录时启用压缩

$ scp -r -C Downloads root@172.20.10.8:/mnt

8) 复制时限制带宽

Use ‘-l’ option in scp command to put limit on bandwidth usage while copying. Bandwidth is specified in Kbit/s, example is shown below,

使用 SCP 命令中的 -l 选项对带宽使用限制。单位 Kbit/s,示例如下

$ scp -l 500 jdk-linux-x64_bin.rpm root@172.20.10.8:/var

9) 使用不同的 SSH 端口

在某些情况下,目标主机上的 ssh 端口会被更改,我们可以使用 -P 选项指定 ssh 端口号。

$ scp -P 2022 jdk-linux-x64_bin.rpm root@172.20.10.8:/var

10) 复制时保留权限、模式和访问时间

在 scp 命令中使用 -p 选项保存从源复制到目标时的权限、访问时间和模式

$ scp -p jdk-linux-x64_bin.rpm root@172.20.10.8:/var/tmp
jdk-linux-x64_bin.rpm 100% 10MB 13.5MB/s 00:00
$

11) 以安静模式复制文件

在 scp 命令中使用 -q 选项禁止 ssh 的传输进度、警告和诊断消息。示例如下

$ scp -q -r Downloads root@172.20.10.8:/var/tmp

12) 使用标识文件

在大多数 Linux 环境中,首选基于密钥的身份验证。在 scp 命令中,我们可以使用 -i 选项指定标识文件或私钥文件,示例如下

$ scp -i my_key.pem -r Downloads root@172.20.10.8:/root

13) 使用不同的 ssh 配置文件

在某些情况下,您使用不同的网络连接到 Linux 系统,可能是某些网络背后是代理服务器,所以在这种情况下,我们必须有不同的 ssh_conig 文件。

scp 命令中不同的 ssh 配置文件通过 -F 选项指定,示例如下

$ scp -F /home/pkumar/new_ssh_config -r Downloads \ 
root@172.20.10.8:/root
root@172.20.10.8's password:
jdk-linux-x64_bin.rpm 100% 10MB 16.6MB/s 00:00
backup-Oct.zip 100% 713MB 41.9MB/s 00:17
index.html 100% 85KB 6.6MB/s 00:00
$

14) 使用不同的密码

缺省情况下,scp 使用 AES-128 算法对文件进行加密。如果您想使用另一个算法,则使用 -c 选项后跟算法名称,示例如下

$ scp -c 3des-cbc -r Downloads root@172.20.10.8:/root

使用下面的命令可以查看 ssh 和 scp 支持的加密算法

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

我的开源项目

作者:鸠摩智首席音效师原文地址:https://segmentfault.com/a/1190000043349416

%s 个评论

要回复文章请先登录注册