分类: LINUX
2011-11-16 23:22:57
rsync:简言之就是差异备份,只备份与初始数据不同的部分。
1. 创建一个新用户exbackup来管理备份
# /usr/sbin/useradd –m –d /data/backups –u 525 –g adm exbackup
l 加到adm组(admin)是因为adm组拥有读日志文件的权限。
l /data/backups用户目录也是存储所有备份的地方。
2. 生成ssh密匙
# su – exbackup
# mkdir .ssh && chmod 700 –R .ssh && cd .ssh
# ssh-keygen –b 2048 –t rsa –f execbackup
[exbackup@localhost ~]$ mkdir .ssh && chmod 700 -R .ssh && cd .ssh
[exbackup@localhost .ssh]$ ssh-keygen -b 2048 -t rsa -f exbackup
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in exbackup.
Your public key has been saved in exbackup.pub.
The key fingerprint is:
0d:e1:6e:34:12:57:96:3a:04:3d:28:c1:62:5b:30:2f exbackup@localhost.localdomain
[exbackup@localhost .ssh]$ ll
总计 16
-rw------- 1 exbackup adm 1675 11-13 21:58 exbackup
-rw-r--r-- 1 exbackup adm 412 11-13 21:58 exbackup.pub
将公匙拷到远程主机authorized_keys中
以下为安全部分:
限制SSH密匙所支持的命令
在远程主机上创建一个叫做ssh_limiter.sh的可执行文件。当使用SSH密匙登录远程主机的时候,该脚本将被调用,并限制任何使用SSH密匙的用户只被允许执行一个命令。
通过往authorized_keys文件添加一些设置项,可以限制SSH所能进行的操作。
authorized_keys设置项
from 限制连接发起源。含有域、FQDN和IP地址
command 指定一个命令,该命令在验证密钥的时候执行
environment 如果ssh支持,设设置用户环境
no-agent-forwarding 禁止SSH认证代理转发
no-port-forwarding 禁止SSH端口转发
no-X11-forwarding 禁止X11转发
# cp exbackup.pub remote_authorized_keys
再创建一个叫做ssh_limiter.sh的文件,在使用exbackup SSH密钥连接远程主机的时候,强制连接命令执行该脚本文件。
# vim ssh_limiter.sh
#!/bin/bash
#Command to be used by exbackup at example.com to limit what exbackup can do on a #remote host.
#SSH2 stores the original command send by the remote host in a variable
#$SSH_ORIGINAL_COMMAND.We will use case to test and limit the commands we are #running
case “$SSH_ORIGINAL_COMMAND” in
*\&*)
echo “UNAUTHORIZED COMMAND”
;;
*\;*)
echo “UNAUTHROIZED COMMAND”
;;
*\|*)
echo “UNAUTHORIZED COMMAND”
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo “UNAUTHORIZED COMMAND”
;;
esac
当远程主机发起连接的时候,变量$SSH_ORIGINAL_COMMAND存有该远程主机上执行的命令。
# ssh ls –l /tmp
变量$SSH_ORIGINAL_COMMAND的值就为“ls –l /tmp”。当用SSH密匙提交该命令时,可以检验该变量,并判断其命令类型是否是SSH密钥可以使用的。在远程主机上执行rsync命令时,该命令含有”rsync – server
case语句检查变量$SSH_ORIGINAL_COMMAND,确保它只含有命令”rsync -- server”。首先,拒绝所有控制型命令&、;和|,这些命令可以用于在目标命令末尾添加其他命令。如果命令以”rsync --server”开头,则接受它(”\--server”确保bash转义”<空格>”语句)。其他传过来的命令可以通过”*”拒绝。case语句以esac作为结尾。
接着,编辑remote_authorized_keys文件,为密匙添加一些设置项
#vim remote_authorized_keys
command=”~/bin/ssh_limiter.sh”,from=”*.example.com”,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqKo3w1f/Pc9A/ah/bgdZ1oIm094L2GfV4shMe/7X4JJimJkutapqkXVbhtg50KeZEON6NPsM/mNSwEyaBP9Pq9O0eFqkVF/n3KkcLFmf34mtrEjmPD3aS1FRCGCg2Fb/OcDEzymjiR8eJvlV6/VjLKVmlbefISdcl0UAYUlZdUbObJmvSlPDrYp5qQCFgOx3empr/UuH6d3JgbYV+qZIVPo4W5+SMZe0H5banbJmX4ubRTrHrya6Wb4sFZ/zs7T+lQqZvcTzxGVACLUV3hk56jsHmsFkhbE5L11Wo20hi01db+KKZ0DqaeVsNwTNz7fiUfckITz19kh9iPQYFV6SXQ== exbackup@example.com
该文件最后将被放在远程主机上。指定在使用密钥的同时可以执行哪些命令,以及哪些主机可以使用该密钥发起连接,还限制了普通用户的常用功能。任何使用该密钥进行连接的用户现在仅可以执行ssh_limiter.sh脚本,该脚本只允许执行rsync命令,并且只允许连接发起方来自*.example.com域。如果需要,可以对”from=”设置项做更多的限制,即设置连接发起方的主机IP地址。
必须确保远程主机的exbackup用户目录下面有一个.ssh目录,权限为700。
# scp /tmp/remote_authorized_keys /tmp/ssh_limiter.ssh
# ssh –t ‘sudo useradd –u 500 –g adm –m –d /data/backups exbackup && sudo –u exbackup mkdir –p /data/backups/.ssh && sudo chmod 700 /data/backups/.ssh’
-t: 强制使用虚拟终端机(pseudo-tty)
# ssh –t \
‘sudo mv remote_authorized_keys /data/backups/.ssh/authorized_keys \
&& sudo chown exbackup:adm /data/backups/.ssh/authorized_keys \
&& sudo chmod 600 /data/backups/.ssh/authorized_keys \
&& sudo –u exbackup mkdir /data/backups/bin \
&& sudo mv ssh_limiter.sh /data/backups/bin \
&& sudo chown exbackup:adm /data/backups/bin/ssh_limiter.sh \
&& sudo chmod 750 /data/backups/bin/ssh_limiter.sh’
# vim /tmp/test_sync.txt
111
222
333
# su – exbackup
# rsync –av –e ‘ssh –i .ssh/exbackup ’ remotehost.example.com:/tmp/test_sync.txt /tmp
# cat /tmp/test_sync.txt
# vim /tmp/test_sync.txt
111
222
333
444
555
666
# rsync –av –e ‘ssh –i .ssh/exbackup’ remotehost.example.com:/tmp/test_sync.txt /tmp
# cat /tmp/test_sync.txt
# ssh –i .ssh/exbackup remotehost.example.com top
可见top命令不能被执行
rsync参数
-a 通用归档模式,以递归方式复制文件,相当于-rlptgoD
-r 以递归方式复制目录及其子目录
-l 保留软连接
-p 保持文件权限
-t 保持文件时间信息
-g 保持文件属组权限
-o 保持文件属主权限
-D 保存设备(字符各块设备)和特殊文件(fifo文件和sockets文件)
--exclued 忽略某些目录或文件,目录或文件名可写成字符串匹配模式。
--inclued 指定包括某些目录或者文件,调整待复制文件。
-n,--dry-run 预览。显示将要发生的动作,实际上并不执行同步操作
一个脚本:
目的:把远程主机的数据同步到本地主机
内容:
1. 两个远程主机server1.example.com和server2.example.com
2. 它们都有目录为/data/staff/sales需要拷贝到本地主机,/data/staff/sales/temp除外
3. 以exbackup用户身份使用已经创建好的无口令密匙执行该脚本
4. 把远程主机的文件同步到执行该脚本的主机的/data/backups目录下
步骤:
1. #vim .ssh/config
Host *.example.com
User exbackup
Identityfile ~/.ssh/exbackup
上面创建的这个文件相当于执行:ssh –I ~/.ssh/exbackup .
2. 用于在主机之间执行rsync操作的脚本
# vim /bin/nightly_remote_rsync.sh
#!/usr/bin/evn bash
#This uses rsync to sync down remote files to the /data/backups/
#The rsync command we will use
RSYNC=’which rsync’
RSYNC_OPTS=’-av’
#Host list – Bash array
HOSTLIST=’
server1.example.com
server2.example.com
’
#Back up directory on local host and source directory on remote host
BACKUP_DIR=’/data/backups’
SALES_DIR=’/data/staff/sales’
#excluded directory
EXCLUDED=’temp/’
#error function
error_check() {
if [ $1 –eq 0 ] ; then
echo “Backup sucessful”
else
echo “Backup failed:see error number:$1”
fi
}
#The rsync functions
get_sales() {
${RSYNC} ${RSYNC_OPTS} –exclude $EXCLUDED $HOST:$SALES _DIR $BACKUP_DIR/$HOST 2>&1 > /dev/null
}
#Bash for loop to go through each host and rsync the data
for HOST in $HOSTLIST; do
get_sales
error_check $?
done
exit0
error_check()子程序或函数接收$?参数,也就是其它函数调用的结束代码
get_sales函数描述了rsync的用法,即使用rsync命令把/data/staff/sales目录同步到/data/backups/
最后一段代码使用循环语句遍历主机列表中的每台主机,并对每台主机进行rsync操作。然后检查每次rsync操作后的错误代码,查看是否为0,如果为0则打印出成功信息。
#crontab –e
#run the nightly rsync script at 5 minutes past 12 every morning
5 0 * * * exbackup /data/backups/bin/nightly_remote_rsync.sh