代码之家  ›  专栏  ›  技术社区  ›  dsl101

从bash脚本运行rsync不保留所有权

  •  1
  • dsl101  · 技术社区  · 12 年前

    我正在尝试创建一个bash脚本,该脚本将指定为命令行参数的目录同步到远程服务器(也由参数指定)。目前,我正在使用 eval ,这解决了参数扩展问题,但由于某种原因,rsync无法保留远程文件的所有权(我知道,除了邪恶之外)。在命令提示符下使用所有相同的标志和参数运行rsync命令效果良好。

    我试着用 $() 作为一种选择,但我在变量扩展和保护远程rsync路径(需要两个引号 带有空格的路径的反斜杠)。

    所以——我想有两个问题——有原因吗 评估 正在阻止 rsync 保留所有权(bash脚本在源机器上以root身份运行,以及 ssh 也以root身份连接到远程计算机(仅限于现在)?有没有办法 $() 在这种情况下工作?(修剪后的)代码如下:

    #!/bin/bash
    
    RSYNC_CMD="/usr/bin/rsync"
    RSYNC_FLAGS="-az --rsh=\"/usr/bin/ssh -i \${DST_KEY}\""  # Protect ${DST_KEY} until it is assigned later
    
    SRC=${1}  # Normally this is sense checked and processed to be a canonical path
    
    # Logic for setting DST based on command line parameter snipped for clarity - just directly assign for testing
    
    DST='root@some.server.com:'
    DST_KEY='/path/to/sshKey.rsa'
    
    TARG=${DST}${SRC//' '/'\ '}  # Escape whitespace for target system
    
    eval ${RSYNC_CMD} ${RSYNC_FLAGS} \"${SRC}\" \"${TARG}\"  # Put quotes round the paths - even though ${TARG} is already escaped
    
    # All synced OK - but ownership not preserved despite -a flag
    

    我试着改变 RSYNC_CMD sudo /usr/bin/rsync ,并添加 --rsync-path="sudo /usr/bin/rsync RSYNC_FLAGS ,但两者都没有任何区别。我就是看不出我错过了什么。。。

    1 回复  |  直到 12 年前
        1
  •  2
  •   chepner    12 年前

    正确的方法是使用数组。 -a 应该已经暗示 -o .

    RSYNC_CMD="/usr/bin/rsync"
    
    DST='root@some.server.com:'
    DST_KEY='/path/to/sshKey.rsa'
    
    RSYNC_FLAGS=(-az --rsh="/usr/bin/ssh -i ${DST_KEY}")
    
    SRC=${1}
    TARG="${DST}$SRC"
    
    ${RSYNC_CMD} "${RSYNC_FLAGS[@]}" "${SRC}" "${TARG}"
    

    使用 RSYNC_RSH 而不是 --rsh ,可以在设置变量值之前导出该变量。这至少可以让您将导出放在设置其余标志的同一区域。然后,您可以推迟完成它的值,直到您有了正确的标识文件之后。

    RSYNC_CMD="/usr/bin/rsync"
    export RSYNC_RSH="/usr/bin/ssh -i %s"  # Use a placeholder for now; set it later
    RSYNC_FLAGS=( -a -z )
    
    # Later...
    
    DST='root@some.server.com:'
    DST_KEY='/path/to/sshKey.rsa'
    RSYNC_RSH=$( printf "$RSYNC_RSH" "$DST_KEY" )
    
    
    SRC=${1}
    TARG="${DST}$SRC"
    
    ${RSYNC_CMD} "${RSYNC_FLAGS[@]}" "${SRC}" "${TARG}"