1

コマンドラインパラメーターとして指定されたディレクトリをリモートサーバー(パラメーターでも指定)に同期するbashスクリプトを作成しようとしています。現在、私はevalパラメータ拡張の問題を解決するを使用していますが、何らかの理由でrsyncがリモートファイルの所有権を保持しない原因になっています(悪であることは別として)。コマンドプロンプトからすべて同じフラグとパラメータを使用してrsyncコマンドを実行すると、正常に機能します。

代わりに使用してみましたが、変数の拡張と、リモートrsyncパス(スペースのあるパスには引用符円記号の$()両方が必要)を保護する必要があるビットを保護することで、実際に混乱しました。

それで-私は2つの質問を推測します-所有権を保持することevalを妨げている理由があり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_CMDsudo /usr/bin/rsync、に追加--rsync-path="sudo /usr/bin/rsyncしてみましRSYNC_FLAGSたが、どちらも違いはありませんでした。何が足りないのかわからない...

4

1 に答える 1

2

これを行う正しい方法は、配列を使用することです。-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、値を設定する前に変数をエクスポートできます。これにより、少なくとも、残りのフラグを設定したのと同じ領域にエクスポートを配置できます。次に、正しいIDファイルを取得するまで、その値の完了を延期できます。

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}"
于 2013-02-25T16:10:22.413 に答える