2013-11-03 73 views
1

我想要一個bash腳本讀取文件並執行引用文件的logindetails的rsync。 我有一個單獨的文件,登錄到所有服務器的詳細信息。Bash - rsync服務器列表

我想使用如下格式:

server=1 
type=openvz 
ip=1.1.1.1 
port=22 
user=root 
pwd=something 
rpath=/home/private/ 
lpath=s1/ 

server=2 
type=openvz 
ip=1.1.1.2 
port=22 
user=root 
pwd=something 
rpath=/home/private/ 
lpath=s2/ 

請有人可以告訴我怎麼可以讓主腳本的正確循環到grep全部來自logindetails文件DATAS,讓rsync的每一個到其他? 例如rsync的腳本:

source serverlist 
sshpass -p $pwd rsync -av --delete [email protected]$ip:$rpath /home/backup/$lpath 

我認爲這必須通過循環得到完成,但我不知道如何告訴bash取每個服務器陸續

謝謝您的幫助!

+0

我想添加另一個函數:如果在shell中沒有給出任何選項,那麼serverlist應該從serverlist中取出。但是如果make(例如)./aa.sh -r 3那麼只有第3項將從serverlist中使用。 我知道如何使用getopts,但是如何在$(seq $ {#server [@]})中修改 ;做 只有在沒有給出身份證的情況下才會打電話? – user2933212

回答

1

您可以使用bash索引數組來創建配置文件。

server[1]=1 
type[1]=openvz 
ip[1]=1.1.1.1 
port[1]=22 
user[1]=root 
pwd[1]=something 
rpath[1]=/home/private/ 
lpath[1]=s1/ 

server[2]=2 
type[2]=openvz 
ip[2]=1.1.1.2 
port[2]=22 
user[2]=root 
pwd[2]=something 
rpath[2]=/home/private/ 
lpath[2]=s2/ 

然後遍歷就可以了。

source serverlist 

for i in $(seq ${#server[@]}); do 
    sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]} 
done 

希望它有幫助。

更新

如果你希望能夠指定要在命令行上同步的服務器,使用猛砸位置參數$1

source serverlist 

if [ "$1" ]; then 
    sshpass -p ${pwd[$1]} rsync -av --delete ${user[$1]}@${ip[$1]}:${rpath[$1]} /home/backup/${lpath[$1]} 

else 
    for i in $(seq ${#server[@]}); do 
     sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]} 
    done 
fi 

然後,使用可選的服務器編號作爲第一個參數來調用腳本。

./script.sh # This would sync all servers in the config file. 
./script.sh 2 # This would sync only server number 2. 

您可以使用getopt的,但它要複雜得多。

更新2

如果您需要使用getopt的,那麼腳本的rsync的一部分轉換成一個bash函數。

source serverlist 

function do_sync() { 
    if [ "$1" ]; then 
     sshpass -p ${pwd[$1]} rsync -av --delete ${user[$1]}@${ip[$1]}:${rpath[$1]} /home/backup/${lpath[$1]} 

    else 
     for i in $(seq ${#server[@]}); do 
      sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]} 
     done 
    fi 
} 

然後,您可以調用與getopt的選項作爲參數,這種功能。

do_sync $getopt_option 
+0

非常感謝!正是我搜索的!大! – user2933212

+0

你好,我對我的入門帖子添加了評論。也許你知道答案?謝謝! – user2933212

+0

@user我已經更新了答案。別客氣。 – Rafa