コマンドラインパラメーターとして指定されたディレクトリをリモートサーバー(パラメーターでも指定)に同期する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_CMD
しsudo /usr/bin/rsync
、に追加--rsync-path="sudo /usr/bin/rsync
してみましRSYNC_FLAGS
たが、どちらも違いはありませんでした。何が足りないのかわからない...