我試圖創建一個bash腳本,它將同步指定爲遠程服務器(也由參數指定)的命令行參數的目錄。目前,我使用的是eval
,它解決了參數擴展問題,但由於某種原因導致rsync不能保留遠程文件的所有權(除了Evil之外,我知道)。使用命令提示符下的所有標誌和參數運行rsync命令可以正常工作。從不保留所有權的bash腳本運行rsync
我嘗試使用$()
作爲替代方案,但我與變量擴展和保護該保護需要用於遠程rsync的路徑(這需要用於與空格的路徑既引號和反斜槓)的位一個真正的混亂。
所以 - 我想2個問題 - 是否有一個原因,eval
阻止rsync
從保留所有權(在bash腳本正在運行的源計算機上的根,和ING ssh
到遠程機器根太 - 只爲現在)?有沒有辦法讓$()
在這種情況下工作?該(修整)代碼如下:
#!/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='[email protected]:'
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
,但沒有取得任何區別。我只是看不到我失蹤的東西...
'rsync --help | grep owner'告訴我:'-o,--owner保存所有者(僅限超級用戶)''。你嘗試過這個選項嗎? – Bobby 2013-02-25 15:54:56
謝謝 - 正如@chepner下面所說的,-a意味着-o,如果我從命令行執行它,它工作正常,所以我推測這是eval(只是可以肯定的是,我確實嘗試了-o,但沒有區別)。我將在接下來的幾天裏給chepner改寫一下。 – dsl101 2013-02-26 17:25:50