Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153742
  • 博文数量: 126
  • 博客积分: 1073
  • 博客等级: 上尉
  • 技术积分: 1175
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 00:32
文章分类

全部博文(126)

文章存档

2018年(56)

2013年(1)

2012年(8)

2011年(61)

分类: 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                                       限制连接发起源。含有域、FQDNIP地址

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.comserver2.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/ directorys

#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

 

阅读(1427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~