指令碼中利用數組實現對機器的批量控制
工作中對線上多台伺服器使用指令碼控制,如執行一些命令等。如果在指令碼中對每台伺服器都使用一條命令因為伺服器的ip,使用者名稱,密碼等可能不同),那麼指令碼會變得非常臃腫,且添加或刪除伺服器不方便。
例如遠端連線一台伺服器,將原生檔案備到伺服器上,通常使用命令:
sshpass -p PASSWORD scp -p PORT -r /date/mysql/* USER@IP:/backup/
如果需要備份到100台伺服器上,需要寫100個這樣的語句。
這裡總結了幾種利用數組實現主機群組的定義,在命令中引用數組來實現簡潔操作。
方法1:
#!/bin/basharray=(passwd1 port1 user1 ip1passwd2 port2 user2 ip2passwd3 port3 user3 ip3passwd4 port4 user4 ip4passwd5 port5 user5 ip5passwd6 port6 user6 ip6) for ((i=0;i<${#array[*]};i=i+4));do echo passwoed is ${array[i]},port is ${array[i+1]},user is ${array[i+2]},ip is ${array[i+3]} #sshpass -p ${array[i]} ssh -p${array[i+1]} ${array[i+2]}@${array[i+3]} "命令" done
數組array中的每一行定義一個主機,明了且方便,可以添加多台伺服器,這個方法最好。
返回的結果如下:
passwoed is passwd1,port is port1,user is user1,ip is ip1passwoed is passwd2,port is port2,user is user2,ip is ip2passwoed is passwd3,port is port3,user is user3,ip is ip3passwoed is passwd4,port is port4,user is user4,ip is ip4passwoed is passwd5,port is port5,user is user5,ip is ip5passwoed is passwd6,port is port6,user is user6,ip is ip6
方法2:
#!/bin/bashpasswd=([0]=passwd1 [1]=passwd2 [2]=passwd3 [3]=passwd4)port=([0]=port1 [1]=port2 [2]=port3 [3]=port4)user=([0]=user1 [1]=user2 [2]=user3 [3]=user4)ip=([0]=ip1 [1]=ip2 [2]=ip3 [3]=ip4)for i in $(seq 0 3);do echo password is ${passwd[i]},port is ${port[i]},user is ${user[i]},IP IS ${ip[i]} #sshpass -p ${passwd[i]} ssh -p${port[i]} ${user[i]}@${ip[i]} "命令"done
這裡定義了4個數組,分別管理密碼,連接埠,使用者和ip,可以達到目的,但不是很明了,添加或去掉伺服器時要仔細。
返回結果如下:
password is passwd1,port is port1,user is user1,IP IS ip1password is passwd2,port is port2,user is user2,IP IS ip2password is passwd3,port is port3,user is user3,IP IS ip3password is passwd4,port is port4,user is user4,IP IS ip4
方法3:
#!/bin/basharray1=(passwd1 port1 user1 ip1)array2=(passwd2 port2 user2 ip2)array3=(passwd3 port3 user3 ip3)for i in `seq 1 3`;doecho password is ${array$i[0]},port is ${array$i[1]},user is ${array$i[2]},ip is ${array$i[3]}#sshpass -p ${array$i[0]} ssh -p${array$i[1]} ${array$i[2]}@${array$i[3]} "命令"done
這裡每個數組定義一個伺服器,直觀,明了。但在引用數組中的元素時出錯,
報錯資訊如下:
line 6: ${array$i[0]},port: bad substitution
${array$i[0]}中不能引用$i,所以這種方法是錯誤的,不知道為什麼數組中的元素名不能用變數表示,希望有知道的朋友講解一下。
本文出自 “阿三哥” 部落格,請務必保留此出處http://asange.blog.51cto.com/7125040/1279482