天天看點

Linux Shell程式設計自動化運維實作——Shell循環

shell循環

for文法結構for    變量名      [ in 取值清單 ]do循環體done      

編寫正常網絡測試腳本

#!/bin/bash#pingip=192.168.100.10ping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ] ;thenecho "$ip" |tee -a ip.txtfi      

因為測試對象多,是以使用循環。

#!/bin/bash#pingfor i  in {2..254}doip=192.168.100.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ] ;thenecho "$ip" |tee -a ip.txtfidone      

優化腳本(背景執行,清空腳本,wait間隔)

#!/bin/bash#ping>ip.txt		##清空記錄文本for i  in {2..254}do{ip=192.168.100.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ] ;thenecho "$ip" |tee -a ip.txtfi}&##背景執行donewait##等待前一個程式執行完畢。在執行下一個指令。echo "finishi...."通過使用者清單檔案建立使用者#!/bin/bash#name#timepass=123#判斷腳本是否有參數if [ $# -eq 0 ] ;thenecho "usage:$0 filename "exit 1fi#判斷使用者輸入的是否是檔案if [ ! -f $1 ];thenecho "error filename"exit 2fi#設定循環,讀取檔案,建立使用者for user in `cat $1`doid $user &> /dev/null#如果使用者不存在,則建立使用者,否則提示已經存在。if [ $? -eq 0 ];thenecho "user $user already exists"elseuseradd $userecho "$pass" | passwd --stdin $user &> /dev/null#判斷使用者是否建立成功,并提示if [ $? -eq 0 ] ; thenecho "$user is created."fifidone      

使用for實作批量主機root密碼的修改

要求1: 已經完成秘鑰登入配置(ssh-keygen)

要求2:定義主機位址清單

要求3:并了解遠端修改密碼的方法

邀請使用者輸入新密碼

#!/bin/bashread -p "請使用者輸入新密碼: "  password#循環調用IP位址for i in $(cat ip.txt)do{#測試IP是否線上ping -c1 -W1 $i &> /dev/null#線上IP進行修改if [ $? -eq 0 ] ;then#修改密碼ssh  $i  "echo $password | passwd --stdin root"#修改成功與否并記錄if  [ $? -eq 0    ] ;thenecho "$i" >>  ok.txtelseecho $i  >> fail.txtfi#不線上的主機記錄。elseecho $i >> meigai.txtfi} &done      
  • while until 循環次數不[一定]是固定的
  • while 語句結構(死循環/逐行處理檔案)
while 條件測試do循環體done當條件測試成立(條件測試為真),執行循環體      
#!/bin/bashwhile :dolet i++sleep 1echo $idone      
  • until文法結構
until 條件測試do循環體done當條件測試成立(條件測試為假視為成立),執行循環體      
#!/bin/bashuntil  [[ $i -eq 14 ]]dolet i++sleep 1echo $idone      
  • expect

我們通過Shell可以實作簡單的控制流功能,但對于需要互動的場合則必須通過人工操作,有時候我們可能會需要實作和互動程式如ssh伺服器等進行互動的功能。而Expect就使用來實作這種功能的工具。

Expect是一個免費的程式設計工具語言,用來實作自動和互動式任務進行通信,而無需人的幹預。

yum install     -y expect tcl tclx tcl-devel        安裝      

通過expect解決ssh互動問題

通過expect編寫腳本

#!/usr/bin/expectspawn ssh [email protected] {"yes/no" { send "yes\r";exp_continue }"password:" { send "666666\r" };}interact      

登入驗證免互動

expect 期望哪些内容

password 就send發送 centos

yes/no 就send發送 yes ,\r 表示回車

interact 允許使用者互動

spawn expect 内部指令,啟動一個shell程式。

exp_continue,跳過循環,就繼續下一條語句。

expect例子:公鑰推送

準備工作:安裝expect,準備公鑰

通過shell循環判斷線上主機

#!/bin/bash#建立一個IP位址檔案。>ip.txt#使用for循環ping測試主機是否線上。for i in {2..254}do{#請注意環境的IP位址,可能與示例中不同。ip=192.168.0.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ];thenecho "$ip" >> ip.txtfi}&donecat  ip.txt 觀察線上主機      
#!/bin/bash#建立一個IP位址檔案。>ip.txt#使用for循環ping測試主機是否線上。for i in {2..254}do{#請注意環境的IP位址,可能與示例中不同。ip=192.168.122.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ];thenecho "$ip" >> ip.txt

        /usr/bin/expect <<-EOFset timeout 10
spawn ssh-copy-id $ipexpect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "centos\r" }}expect eof
EOFfi}&donewaitecho "finishi..."#!/usr/bin/expectset timeout 10
spawn ssh-copy-id 192.168.122.152expect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "centos\r" }}      
#!/bin/bash#建立一個IP位址檔案。>ip.txt#檢測expect是否安裝,檢測公鑰是否建立。rpm -q expect &> /dev/nullif [ $? -ne 0 ] ;thenyum install -y expectfiif [ ! -f ~/.ssh/id_rsa ];thenssh-keygen -P "" -f ~/.ssh/id_rsafi#使用for循環ping測試主機是否線上。之前插入安裝和準備秘鑰。      

繼續閱讀