Posts tagged rsync

使用 rsync 备份多台服务器

0

今天对服务器备份的脚本进行了重构,把配置参数独立成文件,使用 PHP 代替不熟悉的 shell,理顺了思路,分享一下。

【环境】

一共3台服务器,server-1 和 server-2 是线上生产环境,backup-server 是专门用于备份的服务器。

【目的】

定期把 server-1 和 server-2 的 user 目录下的所有文件同步到 backup-server 的指定目录下。

【前提】

backup-server 上有一个用户 backup,他用 ssh-keygen 生成公钥,传到 server-1 和 server-2,这样 backup 用户登录这 2 台线上服务器时不再需要密码。

[backup@backup-server rsync]$ ssh-keygen -t rsa -b 1024

在 ~/.ssh/ 下生成 id_rsa 和 id_rsa.pub,分别是私钥和公钥。

把 id_rsa 重命名成 identity,chmod 600。

把 id_rsa.pub 复制到 server-1 的 /home/user/.ssh/ 目录下,把内容追加到 authorized_keys 文件中,注意此文件也要 chmod 600。

server-2 也如此操作。

之后,backup 用户可以随意 ssh user@server-1 和 ssh user@server-2,不会再问密码。

【功能列表】
* 根据配置文件的 serverName,生成 shell 命令
* 判断是否为唯一 rsync 进程,如果有正在执行的进程,则不执行任何操作
* 确认没有重复进程之后,执行 rsync 命令同步文件,并输出进度信息到 logs 目录
* php 的程序只输出 shell 命令,确认无误后用管道输出给 bash 来运行

【使用方法】
[backup@backup-server rsync]$ /usr/bin/php /home/backup/script/rsync/rsync_web.php server-1 | sh

【详情】

根据 server-1 这个关键字,找到对应的配置信息。

根据一些列规则,生成一串管道命令,输出如下所示:

rsync_process_num=$(ps ax | grep ‘rsync’ | grep -v ‘grep’ | grep ‘server-1′ | grep ‘bwlimit’ | wc -l) && test $rsync_process_num -lt 1 && /usr/bin/nohup /usr/bin/rsync –links –delete –recursive –itemize-changes –progress –exclude-from=/home/backup/script/rsync/conf/exclude.server-1.conf –bwlimit=110 user@server-1:/home/user/* /home/backup/server-1/home/user/ >> /home/backup/script/rsync/logs/rsync_web.server-1.log 2>&1 &

对比“功能列表”,可以看明白这一串命令都在干嘛。

【SVN】

具体的代码,我提交到了 googlecode,欢迎指正:http://leakon.googlecode.com/svn/trunk/server/script/rsync/

 

SSH 信任 无密码 无口令 登录 ssh-keygen

0

做 rsync 远程同步文件的时候,总要输入密码,没法做自动运行。查 rsync 的使用方式,用 –password-file=/home/leakon/secret/rsync.pass 这个参数也还是不行,有人说改文件权限为 600,有人说文件里面只写密码,不要写成 user:pass 的格式。反正怎么试都是不行。

只能寻求建立 SSH 信任关系跳过密码的方式来同步文件了。

本来以前查资料,搞定过用 SecureCRT 不要密码登录 FreeBSD 的,详情见:http://www.leakon.com/archives/55

但到了服务器之间,我还没成功过。

查了好多资料,让人难以理解的表达能力和我自己笨到不行的理解能力,实在看不太明白。

现在我还是说清楚一点吧,我的目标是,在 home 服务器 ssh 远程登录 office 服务器时不必输入密码(帐户名都是 leakon)。

那么,我要在 home 服务器上用 ssh-keygen 生成密钥,rsa 或 dsa:

leakon@home shell> ssh-keygen -t rsa

一路回车,会在 ~/.ssh/下生成 id_rsa 和 id_rsa.pub ,分别是私钥和公钥。

然后,要把 id_rsa.pub 的内容追加到 office 服务器 ~/.ssh/authorized_keys 的尾部:

leakon@home shell> scp ~/.ssh/id_rsa.pub leakon@office:~/leakon_random_rsa.pub

这里改名公钥文件是为了避免覆盖 office 端的同名文件。

登录 office 服务器,把新的公钥文件加入到授权文件中:

leakon@office shell> cat ~/leakon_random_rsa.pub >> ~/.ssh/authorized_keys

注意,请检查这个 authorized_keys 的权限,应该是 600,如果之前不存在,那么创建文件默认的权限是 644,这样是不行的,很多情况下加完授权文件后登录还需要密码,就是因为这里权限不对。

注意,公钥文件添加到了 office ,私钥文件也应该添加到 home 的身份文件中。实际上,只要 id_rsa 这个文件存在于 home 的 ~/.ssh/ 下就没问题,但容易被不小心覆盖,所以应该添加到 ~/.ssh/identity 中,这是与 office 端的 authorized_keys 对应的私钥文件:

leakon@home shell> cat ~/.ssh/id_rsa >> ~/.ssh/identity

注意文件权限也应是 600。

通常这个时候就搞定了,在 home 登录 office 不需要输入密码了。

如果还是不行,下述方法可能有帮助:

  1. 检查 /etc/ssh/sshd_config 中 AuthorizedKeysFile .ssh/authorized_keys 文件位置
  2. 把 /etc/ssh/sshd_config 文件中的 RSAAuthentication yes 打开
  3. home 端的 ssh 可能编译没有完全成功,有先例:home 时钟不对,编译不完全,更正时钟,再编译,完成后可解决问题
  4. 清除 home ~/.ssh/known_hosts 
  5. home 和 office 的用户名应该相同
Go to Top