加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash rsync脚本出错

发布时间:2020-12-15 18:31:59 所属栏目:安全 来源:网络整理
导读:bash脚本具有以下行 rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR 但其中一个选项是rsh =’ssh -p2222′ 它抱怨说: rsync: -p2222': unknown option rsync error: syntax or usage error (code 1) at main.c(1425) [client=3.0.7] 但是当我将脚本更改为: ec
bash脚本具有以下行
rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR

但其中一个选项是rsh =’ssh -p2222′
它抱怨说:

rsync: -p2222': unknown option
    rsync error: syntax or usage error (code 1) at main.c(1425) [client=3.0.7]

但是当我将脚本更改为:

echo rsync $OPTS $BACKDIR $USER@$DEST:$DESTDIR

并手动运行它工作的打印命令.

请指教

简答:见 BashFAQ #50.

答案很长:将命令(或命令的一部分)放入变量中,然后将它们完整地取出是很复杂的.当shell在命令行上扩展变量时,如果变量是双引号,则不解析它(参见@Dennis Williamson的答案);如果它不在引号中,则其中的空格将被解析为参数中断,但不会解析引号和转义(这就是为什么在rsync中的某个args中出现了关于文字引号的错误).在任何一种情况下,将引号放在变量的值中没有任何用处.

但是,有几种方法可以修复脚本,具体取决于OPTS的复杂程度:

>如果–sh是OPTS中唯一的东西,那么双引它(如Dennis Williamson的回答):

OPTS='--rsh=ssh -p2222'
rsync "$OPTS" "$BACKDIR" "$USER@$DEST:$DESTDIR"

(注意其他args周围的双引号:这是为了防止错误,如果它们包含空格,并且通常是良好的脚本卫生.)
>如果OPTS的内容是常量(或至少是–rsh部分),那么不要试图将它放在变量中,只需直接使用它:

rsync --rsh='ssh -p2222' $RESTOFOPTS "$BACKDIR" "$USER@$DEST:$DESTDIR"

>如果这些简单情况都不适用,请使用数组而不是普通变量:

OPTS=(-x --delete --inplace)
if [[ "$rsync_version" == 2.* ]]; then
    OPTS+=(-aE)
else
    OPTS+=(-aNHX)
fi
if [[ -n "$using_rsh" ]]; then
    OPTS+=('--rsh=ssh -p2222')
fi
rsync "${OPTS[@]}" "$BACKDIR" "$USER@$DEST:$DESTDIR"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读