rsync备份bash脚本从另一个文件读取选项

时间:2017-03-05 11:22:53

标签: bash scripting backup rsync

我正在尝试创建一个ssh到多个服务器的脚本并运行它们的备份。服务器具有应包含的不同文件夹。

我尝试使用2个文件来执行此操作,该文件指定了主机名和应包含在备份中的文件夹。

[SERVER]
HOST=server1
SOURCE="/home"
SOURCE="/etc"

[SERVER]
HOST=server2
SOURCE=/home"
SOURCE="/etc"
SOURCE="/var"

[EOF]

一个从该文件读取并执行备份的文件。

while read host
do
        for i in
                 rsync -chazP --fake-super --rsync-path="sudo rsync" --stats backup@$host:/home  /var/backup/$host/
        done
done < /var/backup/testscripts/hosts

当选项文件中只包含主机名时,这是脚本的第一个版本。

如何创建脚本以便读取主机变量,然后读取1 SOURCE行并执行备份,然后读取下一个SOURCE行并再次运行它。当它读取[SERVER]时,它应该重新开始,当涉及到[EOF]它应该结束。

我是脚本编写的初学者,所以欢迎所有的帮助和解释。

2 个答案:

答案 0 :(得分:0)

我建议你从不同角度解决这个问题,以使其更简单。

首先,使/var/backup/testscripts/hosts成为目录,而不是文件。然后,为每个主机创建一个名为&#34; SERVERNAME.backup_config&#34;的配置文件。每个文件的内容都是这样的:

/home
/etc

基本上,只是备份到该主机的目录列表。这样就无需解析配置文件。

config_dir=/var/backup/testscripts/hosts
for config_file in "$config_dir"/*.backup_config
do
  host=${config_file##*/}
  host=${host%.backup_config}
  while IFS= read -r dir
  do
    rsync -chazP --fake-super --rsync-path="sudo rsync" --stats backup@host:"$dir" "/var/backup/$host/"
  done<"$config_file"
done

本质上,我们的想法是在文件名中对服务器名称进行编码,这样文件就变成了一次只能读取一行的列表。对于像这样的简单情况,这可以是一种简单的配置文件的方法。如果每个配置项需要多个列表,则可以再执行一步:将每个服务器作为目录,并为所需的各种列表使用多个配置文件(对于不是的所有列表,可以使用多个配置文件)包含作业的列表,可以使用source.来源阅读。

用于分配host的行是shell扩展,它从文件路径中删除目录名,然后删除扩展名以确定服务器名称。你可以在这里找到它(以及更多):http://wiki.bash-hackers.org/syntax/pe

请注意我没有检查您的rsync命令是否有效,我认为它适用于您的目的。

答案 1 :(得分:0)

不可否认,这个解决方案并不能很好地扩展,但是你将所有东西放在一个文件中,而且你不需要在bash中阅读配置文件。

function my_rsync() {
    rsync -chazP --fake-super --rsync-path="sudo rsync" --stats "$1" "$2"
}


declare -a SERVERS=(
    "server1"
    "server2"
);

declare -a SOURCES1=(
    "/home"
    "/etc"
);

declare -a SOURCES2=(
    "/home"
    "/etc"
    "/var"
);


for SERVER in "${SERVERS[@]}"; do

    case "$SERVER" in
        "server1")
            for SOURCE in "${SOURCES1[@]}"; do
                my_rsync backup@$SERVER:$SOURCE /var/backup/$SERVER/
            done
        ;;
        "server2")
            for SOURCE in "${SOURCES2[@]}"; do
                my_rsync backup@$SERVER:$SOURCE /var/backup/$SERVER/
            done
        ;;
    esac

done

另一个解决方案是使用包含rsync(--include-from=FILE read include patterns from FILE)的包含文件 并为每个服务器创建一个包含文件并命名它们,例如server1.txt / server2.txt等 那你就不需要开关/盒子了,可以写这样的东西(未经测试!):

for SERVER in "${SERVERS[@]}"; do

    rsync -chazP --fake-super --rsync-path="sudo rsync" --stats --include-from=/path/to/$SERVER.txt backup@$SERVER /var/backup/$SERVER/

done