下午 ServerFault,
我遇到了一个似乎可以解决的问题,我目前有一个备份脚本,用于将虚拟机从我们的 VMWare 盒中 rsync 到我们的备份服务器上,我遇到的问题是这样的
**** Starting New Backup
Date: Thu Jan 29 14:09:44 EST 2015
Host: vmhost2
Backup Location: /srv/backups/prod
Dry Run: true
+++=== New VM Backup [27] on [vmhost2] ===+++
---> Target: iDRAC\ Nat
---> VM State: off
rsync -avzhP --delete-after --stats -n root@vmhost2:"/vmfs/volumes/OfficeProd/iDRAC\ Nat" "/srv/backups/prod"
---> RSYNCing VM files
Unexpected local arg: Nat"
If arg is a remote file/dir, prefix it with a colon (:).
rsync error: syntax or usage error (code 1) at main.c(1246) [Receiver=3.0.9]
---! RSYNC Failed, ...
..... truncated .....
+++=== Backup Finished For [27] on [vmhost2] ===+++
An error occurred. Please check /var/log/backups/prod.log
但如果我运行命令 echoed,它就可以正常工作
$ rsync -avzhP --delete-after --stats -n root@vmhost2:"/vmfs/volumes/OfficeProd/iDRAC\ Nat" "/srv/backups/prod"
receiving file list ...
16 files to consider
iDRAC Nat/
iDRAC Nat/iDRAC Nat-e4289c3b.vswp
iDRAC Nat/iDRAC Nat-flat.vmdk
....truncated....
sent 71 bytes received 411 bytes 321.33 bytes/sec
total size is 17.83G speedup is 36996625.28 (DRY RUN)
以下是我尝试在脚本中运行命令的方法
注意:$rsynccmd 由以下方式设置:rsynccmd="rsync -avzhP --delete-after --stats"
if $dryrun
then
rsynccmd_compiled="$rsynccmd -n root@$vmhost:\"$datastore\" \"$backupprefix\""
echo $rsynccmd_compiled
else
rsynccmd_compiled="$rsynccmd root@$vmhost:\"$datastore\" \"$backupprefix\" 2>&1"
fi
log "---> RSYNCing VM files"
cmdresult=`$rsynccmd_compiled`
EXITCODE=$?
if [ $EXITCODE -ne 0 ]
then
chkcmd $? rsync.backup "$cmdresult"
log "---! RSYNC Failed, trying again $retrylimit more times"
EXITCODE=1
retrycount=0
until [ $EXITCODE -eq 0 ]; do
retrycount=$((retrycount + 1))
if [ $retrycount -gt $retrylimit ]
then
break
fi
log "---> RSYNC Retry #$retrycount"
cmdresult=`$rsynccmd_compiled`
EXITCODE=$?
chkcmd $EXITCODE rsync.backup.retry "$cmdresult"
sleep 5
done
fi
非常感谢您的帮助!
答案1
反引号 (`) 本身就需要额外的转义。我发现使用 bash 的 $(...) 更好,因为它不需要额外的转义。
尝试替换:
cmdresult=`$rsynccmd_compiled`
和:
cmdresult=$($rsynccmd_compiled)
另一种方法是将 rsynccmd_compiled 中的每个单个反斜杠替换为三个:
rsynccmd_compiled="$rsynccmd root@$vmhost:\\\"$datastore\\\" \\\"$backupprefix\\\" 2>&1"
好奇的是,给定嵌套级别的反斜杠数量是 (2^n)-1,意味着 0、1、3、7、15、... $(...) 语法可以嵌套而不会出现任何反斜杠爆炸。