我有一个简单的脚本,可以使用 rsync 通过 ssh 从远程服务器备份数据。
我有为此的外部配置文件。在此配置文件中,我有变量:OPTIONS、REMOTE_IP、SOURCE 和 DESTINATION。
现在我需要添加更多远程服务器并开始对多个服务器使用单个脚本。我想用配置中的部分(如 [SERVER_01]、[SERVER_02]...)来定义它。
脚本:
# You can provide external configuration file if you specify it with -c option
# Then if you haven't specified it, use one from ~/rsync_script/config.cfg
if [[ $1 == -c ]]; then
CONFIG_FILE=$2
else
CONFIG_FILE=~/rsync_script/config.cfg
fi
# Add constants from config file to script's environment
if [[ -f $CONFIG_FILE ]]; then
. $CONFIG_FILE
fi
# Create full path before running rsync, because rsync cannot mkdir with -p option
# Run rsync with parameters from config.cfg and put files to $DESTINATION/$REMOTE_IP/YYYY-MM-DD
if [[ -d $DESTINATION ]]; then
mkdir -p $DESTINATION$REMOTE_IP/$(date +"%A")
rsync -avx \
--timeout=30 \
$OPTIONS \
rsync@$REMOTE_IP:$SOURCE $DESTINATION$REMOTE_IP/$(date +"%F")
else
echo "failure"
fi
配置:
# Set extra options for rsync command
OPTIONS="--itemize-changes --log-file=changes.log"
# Set IP address of server the you want to backup
REMOTE_IP="192.168.11.123"
# Set the folder on remote server to backup
SOURCE="/home/rsync/somedata"
# Set the destination folder on local machine
DESTINATION="/backup/"
请给我建议解决这个问题的最佳方法
欢迎任何代码评论和建议:)
谢谢
答案1
这是一个可能的场景。将现有的 rsync 代码 ( if [[ -d $DESTINATION ...
) 放入 shell 函数中,例如runbackup
,并将执行的部分替换. $CONFIG_FILE
为读取文件并查找[SERVER_...]
节分隔符的循环。当它找到一个时,它会调用 runbackup 函数(第一个除外)。对于其他行,它eval
在每行上的操作就像一样.
。为了确保在最后一个部分调用 runbackup,[END]
将在输入中添加一个虚拟部分。
(cat $CONFIG_FILE; echo '[END]') |
while read line
do if [[ "$line" =~ ^\[([A-Z_0-9]+)\] ]]
then if [ -n "$OPTIONS" -a -n "$REMOTE_IP" ]
then echo "section $section"
runbackup
fi
section=${BASH_REMATCH[1]} # captured from =~ regex above
unset OPTIONS REMOTE_IP SOURCE DESTINATION
else eval $line
fi
done