rsync 意外的远程参数:用户@服务器:/路径

rsync 意外的远程参数:用户@服务器:/路径

我正在尝试使用这个 rsync 备份脚本在我的服务器上。但是,我收到以下错误(当脚本尝试执行以下命令时):

$ rsync -ar --delete -vvv -e 'ssh -i /root/.ssh/id_rsa_LAV.pub' --exclude='.*' [email protected]:/www/wp /mnt/hdd/LAV-backups/wp.0
Unexpected remote arg: [email protected]:/www/wp
rsync error: syntax or usage error (code 1) at main.c(1348) [sender=3.1.1]
[sender] _exit_cleanup(code=1, file=main.c, line=1348): about to call exit(1)

奇怪的是,如果我将其复制粘贴到我的终端并按下回车键,一切都会正常工作。只有当脚本执行时才会出错。

这是怎么回事?我该如何修复它?

*复制粘贴 = 回显脚本中的行,然后在运行脚本一次后复制粘贴它。

答案1

当使用带引号的复杂选项时,不要使用普通变量,而是使用数组。

以下在 Bash 备份脚本中对我有用:

simple_options="-a -vi"
filters=(
    --filter 'protect _before-*'
    --filter 'protect lost+found'
    -F
)
#...
rsync ... $simple_options "${filters[@]}" ...

您链接到的脚本似乎仅使用一个简单的变量:

    RSYNC_OPTS="-a --delete -q"
#...
rsync $RSYNC_OPTS $SOURCE_PATH/. $BACKUP_PATH/$SOURCE_BASE.0/.

看来您只是向其中添加了 ssh 选项,这产生了@roger-dueck 在其评论中指出的引用混乱。

改用 Bash 数组,然后在双引号内使用它,因为您的-e参数包含空格:

RSYNC_OPTS=(-a --delete -q -e 'ssh -i /root/.ssh/id_rsa_LAV.pub')
rsync "${RSYNC_OPTS[@]}" $SOURCE_PATH/. $BACKUP_PATH/$SOURCE_BASE.0/.

答案2

脚本语言是什么?它只是一个 bash shell 脚本吗?留意所选脚本方法中的特殊字符。您的命令中的某些内容可能会被替换。

如果是 bash,将整个字符串存储在一个 var 中并将其回显出来,是否一样?如果对其进行了修改,则会看到一些特殊字符,并且会对其进行修改。在 bash 脚本中运行转义的 awk 命令时,我遇到了这个问题。

无关,但 rsync 最适合维护源和目标目录的数据克隆。可能不是及时备份的最佳选择。我建议使用以下方法维护一个保留属性和权限等的克隆。rsync –avz –delete-after

-a(存档,保留数据权限)-v(详细)-z(压缩)-delete-after(等到知道完整文件列表后再删除目标目录中源中不再存在的数据)

答案3

没有给出“获胜解决方案”,我也犯了同样的错误,在我的情况下,我需要转义空格字符!我在这里没有看到,所以对于下一个寻找解决方案的人:

我从我的 rsnapshot.log 中复制了一行。在我的配置中有这个元素:

 --rsync-path="sudo rsync"

在我的日志中它列为:

 --rsync-path=sudo rsync

当我将该部分改为:

 --rsync-path=sudo\ rsync

你所遇到的相同错误在我这边消失了。也许你需要转义字符?也许使用双引号 (") 而不是单引号?(')

相关内容