使用rsync无密码传输

众多数据库服务器的管理过程中,在不同服务器间的文件传输是免不了的。您可以使用scp命令或FTP方法完成文件的发送和接收,这篇文章我将给大家介绍另外一种方法,这就是rsync命令。
rsync是文件传输程序,它的功能和算法描述可以参考维基百科中的介绍。
参考链接:http://zh.wikipedia.org/zh-cn/Rsync

我来通过实验给大家展示一下rsync命令的常用方法。
这里我们演示使用的操作系统是Linux,rsync已经预装好。如果是AIX操作系统,需要单独在IBM网站下载安装包安装。

演示场景:将secDB1服务器SRC目录下的内容同步传输到secDB2服务器DEST目录下,整个过程在secDB1服务器上来完成。

1.在第一台主机的根目录下创建一个名为“/usr/20160626”的目录,作为我们传输演示的源目录。
[[email protected] /]# mkdir /usr/20160626

2.创建文件,根据日期生成文件夹,并拷贝每日生成的文件到新的文件夹中

datestr=$(date +%Y%m%d)
mkdir $datestr
cp $(find /orcl/dir -name "*$datestr.txt" ) /orcl/$datestr/

3.在第二台主机的根目录下创建一个名为“test”的目录,作为我们传输演示的目标目录
[[email protected] /]# cd /usr
[[email protected] /]# mkdir /test

4.将secDB1服务器20160926目录下的内容同步传输到secDB2服务器test目录下
[[email protected] SRC]#  rsync -av "ssh -i /usr/rsync_id_dsa" /orcl/20160926/ [email protected]:/usr/test
[email protected]‘s password:
building file list ... done
./

pos898321045110581_20160926.txt
pos898321045110582_20160926.txt
pos898321045110583_20160926.txt
pos898321045110584_20160926.txt
pos898321045110593_20160926.txt
pos898321045110594_20160926.txt
pos898321045110595_20160926.txt
pos898321045110596_20160926.txt

sent 162 bytes  received 70 bytes  42.18 bytes/sec
total size is 0  speedup is 0.00

5.验证第二台主机的test目录下是否有发送过来的文件
[[email protected] /]# cd /test
[[email protected] DEST]# ls -ltr
total 0
-rw-r--r-- 1 root root 0 Feb 21 02:37 f1
-rw-r--r-- 1 root root 0 Feb 21 02:37 f2

文件发送成功,目的达到。

6.修改test目录下的f1文件内容,使之与源目录SRC中的f1目录不相同
[[email protected] DEST]# echo "mod" > f1
[[email protected] DEST]# cat f1
mod
[[email protected] DEST]# ls -ltr
total 4
-rw-r--r-- 1 root root 0 Feb 21 02:37 f2
-rw-r--r-- 1 root root 4 Feb 21 02:59 f1

7.再次将20160926目录下的内容向test目录同步
[[email protected] SRC]# rsync -av /SRC/ -e ssh [email protected]:/DEST
[email protected]‘s password:
building file list ... done
f1

sent 114 bytes  received 48 bytes  46.29 bytes/sec
total size is 0  speedup is 0.00

注意,此时仅仅将有变化的内容f1同步到了test目录,这也是rsync命令的优势所在。

8.在经过再次同步之后,此时DEST目录下的文件再一次与SRC目录下的内容保持一致。
[[email protected] DEST]# ls -ltr
total 0
-rw-r--r-- 1 root root 0 Feb 21 02:37 f1
-rw-r--r-- 1 root root 0 Feb 21 02:37 f2

9.注意“/”符号带来的差别
如果将“/SRC/”后面的“/”去掉,此时将会将SRC目录和目录的下的所有内容统统的发送到DEST目录下。
[[email protected] SRC]# rsync -av /SRC -e ssh [email protected]:/DEST
[email protected]‘s password:
building file list ... done
SRC/
SRC/f1
SRC/f2

sent 166 bytes  received 70 bytes  67.43 bytes/sec
total size is 0  speedup is 0.00

10.使用rsync命令的联机帮助文档可以获得更多的提示信息
[[email protected] SRC]# rsync -h
……此处内容省略……

11.小结
rsync在给我们传输文件提供另外一种途径的同时,也提高了我们的工作效率。在存在少量差异需要完成文件同步的场合下是不二选择。善用之。

Good luck.

-------------------------------------------------------------------------------------------------------------------------------------

二、取消输入密码

问题描述

在linux平台上常用rsync协议来同步文件和目录,‘rsync‘也是各种linux发行版标配的命令。当我们基于linux平台开发应用程序时,常常需要从Java或者Python代码中调用rsync命令来实现文件的传输。

例如,假设我们要按照如下需求来传输文件:

  • 有两台机器:localhost和remotehost
  • Java程序deploy在localhost上,通过rsync将本机文件传送到remotehost,或者从remotehost pull文件到localhost
  • rsync通过ssh连接remotehost
  • 在remotehost有个叫csdn的帐户,专门用来rsync传输文件,只能用密钥文件登陆
  • 最重要的是,在rsync连接过程中不需要输入csdn的帐户密码,否则密码输入界面会block住Java程序的运行

要实现rsync的无密码传输,基本思路是用一对公私钥来代替帐户密码,实现ssh连接时的认证。

下面我们来看看一步步如何实现。

配置rsync

1. [远端机器] 创建专用帐户csdn

[plain] view plain copy

  1. # 创建用户组csdn
  2. $ groupadd -g 1212 csdn
  3. # 创建csdn用户,并加入csdn用户组
  4. $ useradd -m -s /bin/bash -g 1212 -u 1212 csdn
  5. # 为csdn创建.ssh目录
  6. $ mkdir /home/csdn/.ssh
  7. $ chown csdn:csdn /home/csdn/.ssh
  8. 要上传的文件夹$ chown csdn:csdn/usr/test

注意:

  • gid和uid均为1212,此为示例,也可以选用其它值,只要保证不和现有的用户和组冲突
  • "-m"表示要为csdn用户创建home目录,即/home/csdn/

2. [本地机器] 用ssh-keygen生成密钥

[plain] view plain copy

  1. [[email protected] ~]$ ssh-keygen
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/root/.ssh/id_rsa): /usr/rsync_id_dsa
  4. Enter passphrase (empty for no passphrase):  //输入空
  5. Enter same passphrase again:     //输入空
  6. Your identification has been saved in /usr/rsync_id_dsa.
  7. Your public key has been saved in /usr/rsync_id_dsa.pub.

注意:

  • 在提示输入key file path时,为避免覆盖已有的root帐户的id_rsa文件,将其存储到/usr/rsync_id_dsa
  • 在提示输入文件密码时,直接按回车,采用空密码
  • 最后生成了两个文件,分别存储私钥和公钥

3. [本地机器] 将公钥传送到远端机器csdn帐户的.ssh目录下

[plain] view plain copy

  1. $ scp /usr/rsync_id_dsa.pub [email protected]:/home/csdn/.ssh

4. [远端机器] 将传输过来的公钥导入csdn的authorized_keys文件

[plain] view plain copy

  1. $ cd /home/csdn/.ssh
  2. $ cat rsync_id_dsa.pub > authorized_keys
  3. $ chown csdn:csdn authorized_keys

rsync命令

这样,我们就可以免输密码在两机器间同步文件和目录了,比如,一个最简单的命令:

[plain] view plain copy

  1. $ rsync -e "ssh -i /usr/rsync_id_dsa" /tmp/testfile [email protected]:/tmp/
  2. 传递文件代码为   [[email protected] ~]# rsync -av -e  "ssh -i /usr/rsync_id_dsa" /orcl/20160926/ [email protected]:/usr/test

值得注意的是,当从Java或Python代码中构建rsync命令时,有时很难将-e "ssh -i xxxx"作为一个普通的command option,这里有一个简单的替代方法,就是在启动rsync命令之前,往rsync进程中添加一个环境变量:RSYNC_RSH="ssh -i xxxx"

上面只是一个最简单的rsync命令,其实rsync有许多有意思的选项,可以帮助我们完成很多高端大气上档次的功能。比如,下面是一个更加复杂的命令,用来在两台机器间传输整个目录并在传输完成后删除源文件:

[plain] view plain copy

  1. $ rsync -e "ssh -i /usr/rsync_id_dsa" -v --progress -r -z --compress-level=9 -o -g -p --remove-source-files --temp-dir=/tmp/rsynctmpdir/ --partial-dir=/tmp/rsynctmpdir/ --delay-updates --itemize-changes --out-format=FILEDETAIL::%%n::%%l::%%i::%%M /tmp/testfolder/ [email protected]:/tmp/testfolder/

具体参数的含义可参考rsync文档,这里仅作简单说明:

    • -v:传输过程中打印调式信息
    • --progress:传输过程中打印当前进度
    • -r:递归传输所有子目录和文件
    • -z, --compress-level=9:传输过程中对文件进行压缩,可提高传输效率
    • -o, -g, -p:传输过程中保持文件的ownership, group和permission
    • --remove-source-files:传输结束之后删除源文件。注意,在rsync 2.x中,相应的选项为--remove-sent-files
    • --temp-dir, --partial-dir, --delay-updates:将源目录下所有的文件放在一个transaction里,要么全成功,要么全失败。传输过程中将文件放在temp-dir和partial-dir中,全部完成之后再移动到目标目录。这几个选项在remotehost上有其它程序需要consume传输完成之后的文件时特别有用。
    • --itemize-changes, --out-format:按照指定格式输出每一个要传送的文件信息,这在应用程序需要捕获传输的文件列表时很有用。比如,应用程序仅指定在两个机器间要同步的目录(从localhost到remotehost,或者从remotehost到localhost),然后通过这两个选项就可以捕获rsync的output,过滤出相应的输出行(根据--out-format中指定的"FILEDETAIL"前缀字符串),然后就可以构建出目录下的文件列表了,比如文件名(%%n)、文件大小(%%l)等等
时间: 2024-11-03 17:24:43

使用rsync无密码传输的相关文章

rsync增量传输大文件优化技巧

问题 rsync用来同步数据非常的好用,特别是增量同步.但是有一种情况如果不增加特定的参数就不是很好用了.比如你要同步多个几十个G的文件,然后网络突然断开了一下,这时候你重新启动增量同步.但是发现等了好久都没有进行数据传输,倒是机器的IO一直居高不下. 原因 rsync具体的增量同步算法不太清楚.根据它的表现来看,可能在增量同步已经存在的一个文件时,会校验已传输部分数据是否已源文件一致,校验完成才继续增量同步这个文件剩下的数据.所以如果对一个大文件以这样的算法来增量同步是非常花时间并且占用IO资

rsync无密码备份文件的方法

1.使用ssh-keygen生成秘钥 现在我们来设置ssh,以便在执行ssh操作时不需要密码,使用ssh-keygen在本地生成公钥和私钥. $ ssh-keygen Enter passphrase (empty for no passphrase): Enter same passphrase again: 提示:当提示输入密码时,只需输入两次回车键,不指配密码字符. 2.使用ssh-copy-id将公钥拷贝到远程主机 ssh-copy-id -i ~/.ssh/id_rsa.pub [em

xinted结合rsync 无密码使用

1.安装  yum install -y xinetd rsync 2.配置 cat /etc/xinetd.d/rsync # default: off # description: The rsync server is a good addition to an ftp server, as it # allows crc checksumming etc. service rsync { disable = no flags = IPv6 socket_type     = stream

rsync无密码实时增量同步

rsync -azvP /rsync/ --password-file=/etc/rsyncd/rsyncd.password  [email protected]:/rsync/ rsync -azvP /rsync/ --password-file=/etc/rsyncd/rsyncd.password -e "ssh -p 9095" [email protected]:/rsync/

Linux实现scp无密码传输

主机A 生成密钥 ssh-keygen -t rsa 一路回车(默认生成) cd /root/.ssh 进入密钥目录 scp id_rsa.pub [email protected]主机IP:/root/.ssh/authorized_keys rm -rf id_rsa.pub 主机B ssh-keygen -t rsa 一路回车(默认生成) cd /root/.ssh scp id_rsa.pub [email protected]主机IP:/root/.ssh/authorized_key

paramiko建立无密码传输认证

[email protected]:~# python -V Python 3.4.3 #!/usr/bin/python # -*- coding:utf-8 -*- import paramiko import sys,os home_dir=os.path.expanduser('~') id_rsa_pub='%s/.ssh/id_rsa.pub' % home_dir if not id_rsa_pub:     print('id_rsa.pub error!')     sys.e

Linux之间建立信任,即无密码传输文件

1.基本场景 基本场景是想从一台Server服务器直接登录另一台,或者将Server服务器的数据不需密码验证直接拷贝至Client服务器,以下我们简称Server服务器为S(待发送的数据文件在这台服务器上),Client服务为C,信任关系的最简单操作方法如下: 2.步骤 2.1 在S服务器上,进入当前用户根目录下的隐藏目录 .ssh,命令如下: cd ~/.ssh (注:目录名前的点好"."表示该文件夹是一个特殊的隐藏文件夹,ls命令下默认是看不到的,通过 ls –a 命令观察到) 2

解析rsync大文件传输慢原因以及解决方法

rsync作为一个简便的同步工具,在linux环境中应用较多.能够实现比较简单的文件或目录传输.至于配置相关部分这里不做过多的讲解. +++++++++++++++++++++++++++++++++++++++++++++++ 这里说下rsync大文件时遇到的传输慢的问题,以及应该如何合理的解决这个问题. 现实场景如下,线上环境中需要同步一个15G的文件,服务器都是千兆网卡,正常同步也就150s左右.但是线上环境中同步有时候需要一个多小时,让人很崩溃. 分析过程:开始怀疑网络问题,查了网络环境

Linux rsync配置用于服务器之间传输大量的数据

[教程主题]:rsync [课程录制]: 创E [主要内容] [1] rsync介绍 Rsync(Remote Synchronize) 是一个远程资料同步工具,可通过LAN/WAN快速同步多台主机,Rsync使用所为的“Rsync演算法”来使本地主机和远程主机之间达到同步,这个演算法并不是每次都整份传送,它只传送两台计算机之间所备份的资料不同的部分,因此速度相当快. Rsync的优点如下: 1.可以镜像保存整个目录树和文件系统. 2.可以很容易的做到保持原来文件的许可权.时间.软链接等. 3.