6.5 scp:远程文件复制
6.5.1 命令详解
【命令星级】 ★★★★★
【功能说明】
scp命令用于在不同的主机之间复制文件,它采用SSH协议来保证复制的安全性。scp命令每次都是全量完整复制,因此效率不高,适合第一次复制时使用,增量复制建议使用rsync命令替代。
【语法格式】
scp [option] [[user@]host1:]file1 [[user@]host2:]file2
scp [选项] [用户@主机1:文件1] [用户@主机2:文件2]
**说明:**在scp命令及后面的选项里,每个元素之间都至少要有一个空格。
【选项说明】
表6-5针对该命令的参数选项进行了说明。
表6-5 scp命令的参数选项及说明
6.5.2 使用范例
**范例6-19:**推送(从本地服务器复制到远程服务器)文件或目录。
[root@centos7 /]# ll -h /etc/services #这是将要复制的文件。
-rw-r--r--. 1 root root 655K Jun 7 2013 /etc/services
[root@centos7 /]# scp /etc/services 10.0.0.202:/tmp #scp 传送的文件名 目标主机IP地址:想要传到的目录。
The authenticity of host '10.0.0.202 (10.0.0.202)' can't be established.
RSA key fingerprint is SHA256:B0/rcxEB8cPheVkHbtpksluDK/bMZs8+VyQ7huuHkaQ.
RSA key fingerprint is MD5:8d:ed:58:b4:20:d6:fa:e3:03:69:80:9e:fe:b1:48:bb.
Are you sure you want to continue connecting (yes/no)? yes #第一次scp就和SSH第一次登陆一样。
Warning: Permanently added '10.0.0.202' (RSA) to the list of known hosts.
[email protected]'s password: #此处需要输入远程机器密码。
services 100% 655KB 22.1MB/s 00:00
[root@centos6 ~]# ll -h /tmp/services #这是10.0.0.202的远程主机窗口。
-rw-r--r-- 1 root root 655K Oct 26 00:50 /tmp/services #可以看到赋值后的文件实际有变化。
[root@centos7 /]# scp -p /etc/services 10.0.0.202:/tmp #使用-p选项保持文件属性传输。
[email protected]'s password:
services 100% 655KB 29.7MB/s 00:00
[root@centos6 ~]# ll -h /tmp/services #这是10.0.0.202的远程主机。
-rw-r--r-- 1 root root 655K Jun 7 2013 /tmp/services #加-p,赋值后的文件实际属性保持不变。
[root@centos7 /]# scp -p /tmp 10.0.0.202:/tmp
[email protected]'s password:
/tmp: not a regular file #不能直接赋值目录。
[root@centos7 /]# scp -rp /tmp 10.0.0.202:/tmp #需要使用-r选项复制目录,选项记忆方法:人品rp。
[email protected]'s password:
ks-script-s1kcev 100% 836 997.4KB/s 00:00
services 100% 655KB 39.5MB/s 00:00
services.zip 100% 133KB 15.1MB/s 00:00
ks-script-s1kcev 100% 836 837.8KB/s 00:00
services 100% 655KB 20.1MB/s 00:00
services.zip 100% 133KB 27.5MB/s 00:00
[root@centos6 ~]# tree /tmp/ #在远程主机10.0.0.202下执行tree。
/tmp/
|-- services
`-- tmp
|-- ks-script-s1kcev
|-- services
|-- services.zip
`-- tmp
|-- ks-script-s1kcev
|-- services
`-- services.zip
2 directories, 7 files
**范例6-20:**从远程服务器将数据复制到本地服务器(拉取)。
[root@centos7 /tmp]# scp 10.0.0.202:/etc/services . #与推送的命令顺序对调即可,从10.0.0.202主机上将/etc/services文件下载到当前目录。
[email protected]'s password:
services 100% 626KB 44.7MB/s 00:00
[root@centos7 /tmp]# scp -rp 10.0.0.202:/tmp . #拉取10.0.0.202主机的tmp目录到当前目录。
[email protected]'s password:
services 100% 655KB 36.4MB/s 00:00
services.zip 100% 133KB 3.5MB/s 00:00
ks-script-s1kcev 100% 836 439.4KB/s 00:00
services 100% 655KB 32.1MB/s 00:00
services.zip 100% 133KB 9.0MB/s 00:00
ks-script-s1kcev 100% 836 179.4KB/s 00:00
services 100% 655KB 12.0MB/s 00:00
从上面的实验中还可以看到,本地服务器本身即使有这些文件,但是还会再消耗带宽来复制文件,因此也证明了scp是全量复制。
6.6 rsync:文件同步工具
6.6.1 命令详解
【命令星级】 ★★★★★
【功能说明】
rsync是一款开源的、快速的、多功能的、可实现全量及增量的本地或远程数据镜像同步备份的优秀工具。rsync适用于Unix/Linux/Windows等多种操作系统平台。
【语法格式】
rsync命令有三种常见模式,具体如下:
1)本地模式:
rsync [option] [SRC] [DEST]
rsync [选项] [源文件] [目标文件]
2)通过Shell访问模式:
拉取(Pull):
rsync [option] [USER@]HOST:SRC [DEST]
rsync [选项] 用户@主机:源文件 [目标文件]
推送(Push):
rsync [option] [SRC] [USER@]HOST:DEST
rsync [选项] [源文件] 用户#主机:目标文件
3)rsync守护进程模式
拉取(Pull):
rsync [option] [USER@]HOST::SRC [DEST]
rsync [选项] 用户@主机::源文件 [目标文件]
rsync [option] rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync [选项] rsync://用户@主机:端口/源文件 [目标文件]
推送(Push):
rsync [option] SRC [USER@]HOST::DEST
rsync [选项] [源文件] 用户@主机::目标文件
rsync [option] SRC rsync://[USER@]HOST[:PORT]/DEST
rsync [选项] [源文件] rsync://用户@主机:端口/目标文件
**说明:**在rsync命令及后面的选项里,每个元素之间都至少要有一个空格。
【选项说明】
表6-6针对该命令的参数选项进行了说明。
表6-6 rsync命令的参数选项及说明
6.6.2 使用范例
**范例6-21:**源地址带与不带斜线(/)的区别的例子。
[root@centos7 ~]# mkdir -p /data1/test{1..2} /data2
[root@centos7 ~]# rsync -av /data1/ /data2 #如果源目录的末尾有斜线,就会复制目录内的内容,而不是复制目录本身。
sending incremental file list
./
test1/
test2/
sent 98 bytes received 27 bytes 250.00 bytes/sec
total size is 0 speedup is 0.00
[root@centos7 ~]# rsync -av /data1 /data2 #如果源目录没有斜线,则会复制目录本身及目录下的内容。
sending incremental file list
data1/
data1/test1/
data1/test2/
sent 108 bytes received 28 bytes 272.00 bytes/sec
total size is 0 speedup is 0.00
[root@centos7 ~]# ls /data2
data1 test1 test2
**说明:**目标目录的末尾有没有斜线都不影响最终结果。
**范例6-22:**本地赋值的例子(类似cp)。
[root@centos7 ~]# rsync -av /etc/hosts /tmp #源文件/etc/hosts和目标目录/tmp都在同一台主机之上。
sending incremental file list
hosts
sent 257 bytes received 35 bytes 584.00 bytes/sec
total size is 166 speedup is 0.57
[root@centos7 ~]# ll -h /etc/hosts
-rw-r--r--. 1 root root 166 Oct 24 20:55 /etc/hosts
**提示:**其比cp好的地方就是可以实现增量复制。
**范例6-23:**删除文件的特殊例子(–delete)。
问题:一个目录下有几十万个文件,用什么方式可以最快删除所有文件?
答案如下:
[root@centos7 ~]# mkdir /null #创建一个空目录。
[root@centos7 ~]# rsync -av --delete /null/ /tmp/ #选项--delete使tmp目录内容和孔木兰保持一致,不同的文件及目录将会被删除,即null里有什么内容,tmp里就有什么内容,null里没有的,而tmp里有的就必须要删除,因为null目录为空,因此此命令会删除/tmp目录中所有内容。
sending incremental file list
deleting tmp/tmp/tmp/.font-unix/
deleting tmp/tmp/tmp/.XIM-unix/
deleting tmp/tmp/tmp/.X11-unix/
deleting tmp/tmp/tmp/.Test-unix/
deleting tmp/tmp/tmp/.ICE-unix/
deleting tmp/tmp/tmp/services.zip
deleting tmp/tmp/tmp/services
deleting tmp/tmp/tmp/ks-script-s1kcev
deleting tmp/tmp/tmp/
deleting tmp/tmp/.font-unix/
deleting tmp/tmp/.XIM-unix/
deleting tmp/tmp/.X11-unix/
deleting tmp/tmp/.Test-unix/
deleting tmp/tmp/.ICE-unix/
deleting tmp/tmp/services.zip
deleting tmp/tmp/services
deleting tmp/tmp/ks-script-s1kcev
deleting tmp/tmp/
deleting tmp/.font-unix/
deleting tmp/.XIM-unix/
deleting tmp/.X11-unix/
deleting tmp/.Test-unix/
deleting tmp/.ICE-unix/
deleting tmp/services.zip
deleting tmp/services
deleting tmp/ks-script-s1kcev
deleting tmp/
deleting .font-unix/
deleting .XIM-unix/
deleting .X11-unix/
deleting .Test-unix/
deleting .ICE-unix/
deleting services.zip
deleting services
deleting ks-script-s1kcev
deleting hosts
./
sent 42 bytes received 736 bytes 1,556.00 bytes/sec
total size is 0 speedup is 0.00
[root@centos7 ~]# ls /tmp
**范例6-24:**拉取推送文件及目录(类似前文的scp命令)。
[root@centos7 ~]# rsync -av 10.0.0.202:/tmp/ /tmp
#拉取。
[email protected]'s password: #输入远程主机密码。
receiving incremental file list
./
services
.ICE-unix/
tmp/
tmp/ks-script-s1kcev
tmp/services
tmp/services.zip
tmp/.ICE-unix/
tmp/.Test-unix/
tmp/.X11-unix/
tmp/.XIM-unix/
tmp/.font-unix/
tmp/tmp/
tmp/tmp/ks-script-s1kcev
tmp/tmp/services
tmp/tmp/services.zip
tmp/tmp/.ICE-unix/
tmp/tmp/.Test-unix/
tmp/tmp/.X11-unix/
tmp/tmp/.XIM-unix/
tmp/tmp/.font-unix/
sent 199 bytes received 2,286,120 bytes 653,234.00 bytes/sec
total size is 2,285,005 speedup is 1.00
[root@centos7 ~]# rsync -av /tmp/ 10.0.0.202:/tmp/ #推送。
[email protected]'s password: #输入远程主机密码。
sending incremental file list
sent 493 bytes received 76 bytes 227.60 bytes/sec
total size is 2,285,005 speedup is 4,015.83
与scp命令复制的结果进行对比可以发现,使用rsync复制时,重复执行复制直至目录下文件相同就不再进行复制了。
**范例6-25:**利用SSH隧道模式(-e)拉取推送文件及目录。
[root@centos7 ~]# touch /tmp/test.txt #再创建一个新的测试文件。
[root@centos7 ~]# rsync -av -e 'ssh -p 22' /tmp 10.0.0.202:/tmp/ #前面的案例使用rsync同步数据都是明文传输的,在要求保障数据安全的场景下,可以使用-e选项借助SSH隧道进行加密传输数据,-p是SSH命令的选项,指定SSH传输的端口号为22,这条命令的结果是将本地/tmp目录下的内容通过SSH加密隧道推送数据到10.0.0.202主机的/tmp目录。同理,执行“rsync -av -e 'ssh -p 22' 10.0.0.202:/tmp/ /tmp”可以从10.0.0.202主机的/tmp目录通过SSH加密隧道将数据拉取到本地/tmp目录下。
[email protected]'s password:
sending incremental file list
tmp/
tmp/services
tmp/test.txt
tmp/.ICE-unix/
tmp/tmp/
tmp/tmp/tmp/
tmp/tmp/tmp/ks-script-s1kcev
tmp/tmp/tmp/services
tmp/tmp/tmp/services.zip
tmp/tmp/tmp/.ICE-unix/
tmp/tmp/tmp/.Test-unix/
tmp/tmp/tmp/.X11-unix/
tmp/tmp/tmp/.XIM-unix/
tmp/tmp/tmp/.font-unix/
sent 811,563 bytes received 5,175 bytes 233,353.71 bytes/sec
total size is 2,285,005 speedup is 2.80
rsync命令的守护进程模式已经超出了本书的范围,读者可以查阅《跟老男孩学习Linux运维:Web集群实战》一书2017年底即将改版的最新版本。
6.6.3 经验技巧
下面列出rsync命令的经验技巧以供读者参考。
1)生产场景常用选项-avz,相当于-vzrtopg(这是网上文档常见的选项),但是此处建议大家使用-avz选项,更简单明了。如果在脚本中使用也可以省略-v选项。
2)关于z压缩选项的使用建议,如果为内网环境,且没有其他业务占用带宽,可以不使用z选项。不压缩传输,几乎可以满带宽传输(千M网络),压缩传输则网络发送速度就会骤降,压缩的速率赶不上传输的速度。
3)选项n是一个提供安全性的选项,它可以结合-v选项输出模拟的传输过程,如果没有错误,则可以去除n选项真正的传输文件。