一、rsync命令介绍
在Linux中,`rsync` 是一个强大的命令行工具,用于同步文件和目录。它可以在本地或通过网络在远程系统之间复制文件。
二、远程目录复制的条件
1、系统要已经安装rsync工具
要使用 `rsync` 复制远程目录,需要确保系统上安装了 `rsync` ,并且具有相应的权限来执行数据传输。远程机器上也需要有 rsync 服务端(通常 rsync 会作为 SSH 的一部分一起安装)。
在linux命令行直接输入:
rsync
出现类似下图的输出,表明 rsync 已经安装成功,可以使用了。
2、正确获得远程的端口号
Rsync默认使用的 SSH 端口号22,若远程主机的端口号不是22,需要特别指定对应的端口号。命令要指明正确的端口号,如下命令:
rsync -avz -e 'ssh -p 2222' username@remote_host:/path/to/remote/directory/ /path/to/local/directory/
其中 2222 是远程机器的 SSH 端口。
实际操作如下:
[root@localhost ~]#
[root@localhost ~]# rsync -avz root@192.168.1.109:/usr/java/jdk1.8.0_121/include /home/test-rsync1
ssh: connect to host 192.168.1.109 port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.2]
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rsync -avz -e 'ssh -p 2222' root@192.168.1.109:/usr/java/jdk1.8.0_121/include /home/test-rsync1
root@192.168.1.109's password:
receiving incremental file list
sent 26 bytes received 215 bytes 53.56 bytes/sec
total size is 191,947 speedup is 796.46
[root@localhost ~]#
[root@localhost ~]#
可以看出,主机192.168.1.109的端口22不接受连接,改成2222端口后,可以正常执行命令。
三、命令实例和解释
1、目录复制命令
(1)本地目录复制到远程主机的命令
以下是一个基本的 `rsync` 命令,用于远程复制目录:
rsync -avz --delete /path/source_directory user@remote_host:/path/to/destination_directory
这里各选项的含义是:
`-a`:归档模式,它保持符号链接、权限、时间戳、组和所有权信息。
`-v`:详细模式,它输出同步过程中的详细信息。
`-z`:压缩文件数据。
`--delete`:在同步时删除那些只存在于目的目录中的文件。
实际应用的时候, 需要将 `/path/source_directory` 替换为我们想要复制的本地目录的路径,将 `user@remote_host` 替换为远程服务器的用户名和主机名,将 `/path/to/destination_directory` 替换为远程服务器上的目标目录路径。
例如,如果想要将本地的 `/home/user/source_dir` 目录复制到远程服务器 `remote.example.com` 上的 `/home/user/dest_dir` 目录,可以使用以下命令:
rsync -avz --delete /home/user/source_dir user@remote.example.com:/home/user/dest_dir
在执行 `rsync` 命令之前,需要确保远程服务器上的用户具有足够的权限来接收文件,并且远程目录存在。如果不存在,`rsync` 会提示创建它。
(2)远程主机复制到本地目录的命令
若想远程主机的某个目录复制到本地的某个目录,可以采用如下命令:
rsync -avz --delete user@remote_host:/path/source_directory /path/to/destination_directory
实际应用,比如把192.168.1.109的目录 /usr/java/jdk1.8.0_121/include 复制到本地的/home/test-rsyn1目录下,可以采用如下命令:
rsync -avz root@192.168.1.109:/usr/java/jdk1.8.0_121/include /home/test-rsyn1
实际操作如下:
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# rsync -avz root@192.168.1.109:/usr/java/jdk1.8.0_121/include /home/test-rsync1
root@192.168.1.109's password:
receiving incremental file list
created directory /home/test-rsync1
include/
include/classfile_constants.h
include/jawt.h
include/jdwpTransport.h
include/jni.h
include/jvmti.h
include/jvmticmlr.h
include/linux/
include/linux/jawt_md.h
include/linux/jni_md.h
sent 192 bytes received 31,339 bytes 9,008.86 bytes/sec
total size is 191,947 speedup is 6.09
[root@localhost ~]# ll /home/test-rsync1/include/
总用量 192
-rw-r--r-- 1 10 143 20128 12月 13 2016 classfile_constants.h
-rw-r--r-- 1 10 143 8690 12月 13 2016 jawt.h
-rw-r--r-- 1 10 143 6407 12月 13 2016 jdwpTransport.h
-rw-r--r-- 1 10 143 73701 12月 13 2016 jni.h
-rw-r--r-- 1 10 143 3774 12月 13 2016 jvmticmlr.h
-rw-r--r-- 1 10 143 77428 12月 13 2016 jvmti.h
drwxr-xr-x 2 10 143 39 12月 13 2016 linux
[root@localhost ~]#
从操作结果中可以看出,命令执行成功,远程主机的目录及子目录和文件已经全部复制到本地的目录中了。
2、注意事项
由于 `rsync` 默认是同步两个目录的内容,如果目的目录中不存在某些源目录中的文件,它们不会被自动创建。使用 `--delete` 选项可以确保在目的目录中,删除那些只存在于源目录中的文件。
为了安全起见,`rsync` 传输的数据会通过 SSH 进行加密,因此需要有 SSH 密钥对,并且远程服务器上的用户需要配置好 SSH 免密登录。如果没有为 `rsync` 设置 SSH 密钥对,在执行命令时将被提示输入远程服务器的密码。
文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。