使用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”的目录,作为我们传输演示的源目录。
[root@secDB1 /]# mkdir /usr/20160626
2.创建文件,根据日期生成文件夹,并拷贝每日生成的文件到新的文件夹中
datestr=$(date +%Y%m%d)
mkdir $datestr
cp $(find /orcl/dir -name "*$datestr.txt" ) /orcl/$datestr/
3.在第二台主机的根目录下创建一个名为“test”的目录,作为我们传输演示的目标目录
[root@secDB2 /]# cd /usr
[root@secDB2 /]# mkdir /test
4.将secDB1服务器20160926目录下的内容同步传输到secDB2服务器test目录下
[root@secDB1 SRC]# rsync -av "ssh -i /usr/rsync_id_dsa" /orcl/20160926/ csdn@61.132.54.173:/usr/test
root@172.17.193.211'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目录下是否有发送过来的文件
[root@secDB2 /]# cd /test
[root@secDB2 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目录不相同
[root@secDB2 DEST]# echo "mod" > f1
[root@secDB2 DEST]# cat f1
mod
[root@secDB2 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目录同步
[root@secDB1 SRC]# rsync -av /SRC/ -e ssh root@172.17.193.211:/DEST
root@172.17.193.211'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目录下的内容保持一致。
[root@secDB2 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目录下。
[root@secDB1 SRC]# rsync -av /SRC -e ssh root@172.17.193.211:/DEST
root@172.17.193.211'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命令的联机帮助文档可以获得更多的提示信息
[root@secDB1 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
- # 创建用户组csdn
- $ groupadd -g 1212 csdn
- # 创建csdn用户,并加入csdn用户组
- $ useradd -m -s /bin/bash -g 1212 -u 1212 csdn
- # 为csdn创建.ssh目录
- $ mkdir /home/csdn/.ssh
- $ chown csdn:csdn /home/csdn/.ssh
- 要上传的文件夹$ chown csdn:csdn/usr/test
注意:
- gid和uid均为1212,此为示例,也可以选用其它值,只要保证不和现有的用户和组冲突
- "-m"表示要为csdn用户创建home目录,即/home/csdn/
2. [本地机器] 用ssh-keygen生成密钥
- [root@xxxx ~]$ ssh-keygen
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.ssh/id_rsa): /usr/rsync_id_dsa
- Enter passphrase (empty for no passphrase): //输入空
- Enter same passphrase again: //输入空
- Your identification has been saved in /usr/rsync_id_dsa.
- 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目录下
- $ scp /usr/rsync_id_dsa.pub root@171.69.201.209:/home/csdn/.ssh
4. [远端机器] 将传输过来的公钥导入csdn的authorized_keys文件
- $ cd /home/csdn/.ssh
- $ cat rsync_id_dsa.pub > authorized_keys
- $ chown csdn:csdn authorized_keys
rsync命令
这样,我们就可以免输密码在两机器间同步文件和目录了,比如,一个最简单的命令:
- $ rsync -e "ssh -i /usr/rsync_id_dsa" /tmp/testfile csdn@remotehost:/tmp/
- 传递文件代码为 [root@postest ~]# rsync -av -e "ssh -i /usr/rsync_id_dsa" /orcl/20160926/ csdn@61.132.54.173:/usr/test
值得注意的是,当从Java或Python代码中构建rsync命令时,有时很难将-e "ssh -i xxxx"作为一个普通的command option,这里有一个简单的替代方法,就是在启动rsync命令之前,往rsync进程中添加一个环境变量:RSYNC_RSH="ssh -i xxxx"
上面只是一个最简单的rsync命令,其实rsync有许多有意思的选项,可以帮助我们完成很多高端大气上档次的功能。比如,下面是一个更加复杂的命令,用来在两台机器间传输整个目录并在传输完成后删除源文件:
- $ 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/ csdn@remotehost:/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)等等
使用rsync无密码传输的更多相关文章
- rsync 无密码传输文件
最近机器迁移,需要备份文件,但各个机器间不能穿梭,即无法通过scp来传输文件, 在运维的建议下,选用了rsync作为传输的工具. 默认情况Ubuntu安装了rsync服务,但在/etc下没有配置文件, ...
- rsync 无密码 传输
1.通过ssh执行rsync(需要密码) 通过ssh帐户(需要密码)执行rsync,将文件同步镜像到远程服务器.下面这个例子将本地的/home/ramesh同步到远程目录/backup/ramesh( ...
- ssh key scp命令 scp无密码传输
ssh ~/.ssh/目录下通常有个文件 [root@user .ssh]# ll 总用量 16 -rw-------. 1 root root 552 11月 16 02:48 authorized ...
- rsync增量传输大文件优化技巧
问题 rsync用来同步数据非常的好用,特别是增量同步.但是有一种情况如果不增加特定的参数就不是很好用了.比如你要同步多个几十个G的文件,然后网络突然断开了一下,这时候你重新启动增量同步.但是发现等了 ...
- 分享一个linux和linux的文件传输【scp无密码传输】
很多时候,本地测试服务器想把文件传到线上服务器的时候,很多人都是通过登陆线上服务器ssh 传输,这样挺危险的,很多弊端....所以我找了下方法,发现scp挺好用的! 模拟环境: 192.168.147 ...
- mac rsync文件传输
rsync -avz filename servername:/filename --exclude '*.log' --exclude '*.pyc' --exclude '*.db' --excl ...
- rsync来传输文件(可断点续传)
scp传文件的话如果出错就得重新来过, 用rsync可以实现断点上传的功能 大概就是这样用: rsync -P --rsh=ssh home.tar 192.168.205.34:/home/h ...
- scp和rsync限制传输速度
1.scp 限速100KB/s scp -l 1000 test root@192.168.1.104 此时的传输速率就是1M/8=100KB左右 2.rsync 限速100KB/s rsync -a ...
- rsync无密码实时增量同步
rsync -azvP /rsync/ --password-file=/etc/rsyncd/rsyncd.password ruiy@192.168.11.199:/rsync/ rsync - ...
随机推荐
- 筛法求质——poj2262&2909
这两道题都是哥赫巴德猜想的内容.基本的技术点都是在一个很大的数字范围里面求质数.直接判断两个数是不是质数,这种方法虽然可行但是还是很慢的.所以这两题我们使用打表! 而建立质数表的方法就是筛法求质,速度 ...
- Java 多线程系列
要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. Java中的主要同步机制是关键字synchronized,它提供了一种独 ...
- 依赖注入(IOC)
依赖注入(IOC) 背景介绍 在设计模式中,尤其是结构型模式很多时候解决的就是对象间的依赖关系,变依赖具体为依赖抽象.平时开发中如果发现客户程序依赖某个或某类对象,我们常常会对他们进行一次抽象,形成抽 ...
- Extjs4.2 Tree使用技巧
Extjs4.2 Tree使用技巧小结demo 本案例使用了Ext.Tree.Panel的如下知识点: 1.刷新.重新加载Tree,定位到上次的节点位置 2.Tree的右键操作 3.Extjs4.x ...
- hdu 1728 搜索求最少的转向次数
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- C语言序列点浅析
摘要: 现行国内的C语言教材普遍不介绍序列点,这使得读者只能“死记硬背”有序列点表达式的求值顺序,不仅造成了读者对C语言知识的认知残缺不全,而且也影响了读者学习的积极性.本文总结了序列点的作用,即表达 ...
- IDEA异常解决: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
有时候解决问题不仅仅是解决问题.-----jstarseven 最近因为开发需要,需要搭建一个ssm开发框架,采用了开发工具IDEA. 整合完了SSM开发框架之后,发布的时候出现org.apache. ...
- 使用unity创建塔防游戏(原译)(part1)
塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...
- JavaScript :memory leak [转]
Memory leak patterns in JavaScript Handling circular references in JavaScript applications Abhijeet ...
- Extjs的GridPanel分页前后台完整代码实例
第一次写文章啊,有些冲动.最近在公司学习Extjs,做了一个分页的小实例和大家分享. 1.首先编写paging-grid.js文件,这是我在网上参考的例子改写的,大同小异. Ext.onReady(f ...