Linux中使用scp(复制)、sftp(复制)、rsync(同步)在系统间传输文件

一 环境准备

主机名master:10.0.0.10 文件传输方
主机名node1: 10.0.0.11 文件接收方

说明:
scp与sftp作为运行SSH服务的远程系统来回传输文件的安全方式,是将远程文件进行复制到另一个系统。在使用scp与sftp之前,需要能够完成ssh远程连接。
rsync命令则用来同步不同系统的文件。它与scp的区别在于,如果两个系统的文件或目录有差异,rsync只复制差异部分,而scp则复制全部内容。

二 scp使用

2.1 检查SSH服务

可以直接查看sshd的端口22是否被监听

[root@master .ssh]# netstat -lntup|grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6940/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      6940/sshd  

也可以使用systemctl命令检查sshd服务的启动状态

[root@master .ssh]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-12-10 00:03:13 CST; 3 days ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 6940 (sshd)
    Tasks: 1
   CGroup: /system.slice/sshd.service
           └─6940 /usr/sbin/sshd -D

2.2 传输文件

使用scp 本地文件 远程主机IP:文件路径格式来将本地文件复制到远端。
输入命令后,要求提供远程主机root账号的密码,正确输入密码后文件传输成功。

[root@master .ssh]# scp /etc/hosts 10.0.0.11:/tmp
The authenticity of host '10.0.0.11 (10.0.0.11)' can't be established.
ECDSA key fingerprint is SHA256:XcbgLkoJin+3R2uL/9R8sxuELxjYJOQOABBFodvwug0.
ECDSA key fingerprint is MD5:ee:69:ca:49:b0:6a:78:68:ea:15:3a:7d:d9:a3:a1:1f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.11' (ECDSA) to the list of known hosts.
root@10.0.0.11's password: 
hosts   

2.3 检查文件

此时我们检查10.0.0.11的主机,可以发现 /tmp 目录下的 /etc/hosts 文件。

[root@node1 ~]# ll /tmp/hosts 
-rw-r--r-- 1 root root 214 Dec 13 09:45 /tmp/hosts

2.4 参数说明

除了可以将本地文件复制到远端,也可以将远端的目录下面的文件拉取到本地。
这里涉及了两个常用的参数。

-r 递归的形式复制目录下的文件
-p 复制远程系统的文件时,不改变其文件属性

将远端的/server/scripts下的脚本拉取复制到本地/tmp目录下
首先清理不需要的文件。

[root@master ~]# cd /tmp/
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0

其次,复制远端的脚本。

[root@master tmp]# scp -rp 10.0.0.11:/server/scripts/ /tmp/
root@10.0.0.11's password: 
ping.sh                                                                                       100%    1     0.5KB/s   00:00    
vim.sh                                                                                        100%  448   146.4KB/s   00:00   

输入密码后,会显示复制过来的文件。
然后进行检查确认。

[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# tree
.
└── scripts
    ├── ping.sh
    └── vim.sh

1 directory, 2 files

由此可见,将远端的目录与目录下的文件一起复制了。

三 sftp使用

使用该命令,我们可以将远端文件下载到本地,也可以将本地文件上传到远端。

3.1 将文件上传至远端

命令后跟上远端的IP,就可以进入交互式界面。
进入到远端的tmp目录下,将本地刚刚获取的脚本放到远端的tmp目录下。
使用put,将本地文件复制到远端。

[root@master tmp]# sftp 10.0.0.11
root@10.0.0.11's password: 
Connected to 10.0.0.11.
sftp> cd /tmp/
sftp> put /tmp/scripts/ping.sh 
Uploading /tmp/scripts/ping.sh to /tmp/ping.sh
/tmp/scripts/ping.sh                                                                          100%    1     0.1KB/s   00:00  

3.2 将远端文件下载至本地

首先清理一下我们刚才获得的tmp目录下的脚本。

[root@master ~]# cd /tmp/
[root@master tmp]# ll
total 0
drwxr-xr-x 2 root root 35 Dec 13 10:04 scripts
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0

然后进入交互式界面,进入远端的/server/scripts目录,获取脚本

[root@master tmp]# sftp 10.0.0.11
root@10.0.0.11's password: 
Connected to 10.0.0.11.
sftp> cd /server/scripts/
sftp> get vim.sh
Fetching /server/scripts/vim.sh to vim.sh
/server/scripts/vim.sh                                                                        100%  448   316.0KB/s   00:00    
sftp> ^D
[root@master tmp]# ll
total 4
-rw-r--r-- 1 root root 448 Dec 13 10:20 vim.sh

需要注意的是,上传和下载最后存放文件的位置,默认是我们交互式命令开始前,所在的目录下。因此想要上传文件,需要先进入某目录,然后put该文件;想要下载文件至某目录,必须先进入那个目录,然后开启交互式命令,再在远端get该文件。

四 rsync使用

首先清理之前的环境,确保文件可以完整的传输。

# 10.0.0.10
[root@master tmp]# rm -rf *
[root@master tmp]# ll
total 0

# 10.0.0.11
[root@node1 .ssh]# cd /tmp/
[root@node1 tmp]# ll
total 8
-rw-r--r-- 1 root root 214 Dec 13 09:45 hosts
-rw-r--r-- 1 root root   1 Dec 13 10:16 ping.sh
drwx------ 3 root root  17 Dec 13  2022 systemd-private-6e8f91e32c7e42eb98a65c2931c4842d-cups.service-eVdmK7
drwx------ 2 root root   6 Dec  9 23:04 vmware-root_6590-692621205
drwx------ 2 root root   6 Dec  9 17:06 vmware-root_6592-961069012
drwx------ 2 root root   6 Dec 13  2022 vmware-root_6631-1991582773
[root@node1 tmp]# rm -rf *
[root@node1 tmp]# ll
total 0

4.1 检查命令

首先检查本地系统是否有该命令的软件包,能否使用命令。

[root@master tmp]# rpm -qa|grep rsync
rsync-3.1.2-4.el7.x86_64

# 如果没有rsync命令,则yum安装
[root@master tmp]# yum install -y rsync

4.2 传输文件

命令格式与scp类似,rsync 参数 本地目录或文件 远端IP:绝对路径

[root@master tmp]# rsync -avz /etc/hosts 10.0.0.11:/tmp
root@10.0.0.11's password: 
sending incremental file list
hosts

sent 172 bytes  received 35 bytes  59.14 bytes/sec
total size is 214  speedup is 1.03

4.3 检查结果

文件准确传输。

[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
[root@node1 tmp]# cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.0.10   master
10.0.0.11   node1
10.0.0.12   node2

4.4 传输目录

首先准备环境。
/tmp目录下创建两个文件。

[root@master tmp]# touch master1.sh master2.sh
[root@master tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root 0 Dec 13 10:33 master2.sh

然后先传输文件。

[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
root@10.0.0.11's password: 
sending incremental file list
./
master1.sh
master2.sh

sent 305 bytes  received 62 bytes  104.86 bytes/sec
total size is 0  speedup is 0.00

检查发现,远端收到了两个普通文件。

[root@master tmp]# rsync -avz /tmp/ 10.0.0.11:/tmp
root@10.0.0.11's password: 
sending incremental file list
./
master1.sh
master2.sh

sent 305 bytes  received 62 bytes  104.86 bytes/sec
total size is 0  speedup is 0.00

然后再传输目录。

[root@master tmp]# rsync -avz /tmp 10.0.0.11:/tmp
root@10.0.0.11's password: 
sending incremental file list
tmp/
tmp/master1.sh
tmp/master2.sh
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/

sent 329 bytes  received 78 bytes  116.29 bytes/sec
total size is 0  speedup is 0.00

这次输出的信息好像有点多,然后检查一下远端10.0.0.11的结果。

[root@node1 tmp]# ll
total 4
-rw-r--r-- 1 root root 214 Nov 28 14:00 hosts
-rw-r--r-- 1 root root   0 Dec 13 10:33 master1.sh
-rw-r--r-- 1 root root   0 Dec 13 10:33 master2.sh
drwxrwxrwt 7 root root 129 Dec 13 10:33 tmp

不难发现,这次准确的将目录以及下面的文件都同步了过来。

所以,需要注意的是,如果源目录(被传输的目录)后面有 / ,例如/tmp/,那么将只传输目录/tmp下面的文件;如果源目录(被传输的目录)后面没有 / ,例如/tmp,那么将传输整个目录/tmp及下面的文件。

4.5 常用参数说明

参数-a是一个存档参数,包括下面参数的功能之和。

参数作用
-r以递归方式同步整个目录树
-l同步软连接
-p保留权限
-t保留时间戳
-g保留属组权限
-o保留文件所有者
-D同步设备文件

参数-v ,在文件同步时会输出详细的添加信息。
参数-z,在文件传输时进行压缩提高效率。

此处需要注意的是,参数-a不会同步高级文件的权限。
要开启ACL同步,需要再添加-A参数;
要将源文件的SELINUX同步到目标文件,需要添加-X参数。

此外,上文的举例说明是将本地文件同步到远端,也可以将远端文件同步到本地,只需要参数位置换即可。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值