2014-03-27 20 views
0

您好我是shell腳本編程的新手。我的要求是: 有一個服務器3個客戶端。在每個客戶端上生成錯誤日誌文件,這些文件有4種類型。類型1錯誤,類型2錯誤類似於這種類型4錯誤。 我想寫一個腳本,從服務器讀取所有3個客戶端&爲我提供了多少次在每個客戶端上生成4種不同類型的錯誤日誌。 總之它應該使用ssh & grep命令組合。 我已經寫了演示腳本,但它沒有提供給我不同類型的日誌發生在客戶端上的次數。用於統計Unix客戶端上的文件類型的代碼

#error[1]='Exception: An application error occurred during an address lookup request, please contact IT' 
#error[2]='SocketTimeoutException: Read timed out' 
#error[3]='Exception: The search has produced too many matches to be returned' 
#error[4]='Exception: No matching address found' 
error_1='exception 1' 
error_2='exception 2' 
function get_list_of_clients() 
{ 
NUM_OF_CLIENTS=$(wc -l ${CLIENT_IP_LIST} | awk -F " " '{ print $1 }') 
echo $NUM_OF_CLIENTS 
     if [ "${NUM_OF_CLIENTS}" -gt 0 ] 
     then 
      for ((row=2; row<=$NUM_OF_CLIENTS; row++)) 
      do 
        CLIENTS_IP=$(sed -n ${row}p ${CLIENT_IP_LIST}| awk -F " " '{print $3 }') 
        echo ${CLIENTS_IP} 
#     get_number_of_errors 
#     copy_count_errors 
      echo ${$error_$row} 
      done 
     fi 

} 

function get_number_of_errors() 
{ 
for((row_no=1; row_no<=4; row_no++)) 
do 
{ 
/usr/bin/expect - <<- EndMark 
spawn ssh [email protected]${CLIENTS_IP} "grep $error[$row_no] var/error.log |wc -l" >> /tmp/${CLIENTS_IP}_error${row_no}.txt 
match_max 50000 
    expect { 
    "*yes/no*" { 
    send -- "yes\r" 
    send -- "\r" 
    exp_continue 
} 
    "*?assword:*" { 
    send -- "${CLIENT_PASSWORD}\r" 
    send -- "\r" 
    } 

} 
expect eof 
EndMark 
} 
done 
} 


function copy_count_errors() 
{ 
/usr/bin/expect - <<- EndMark 
spawn scp [email protected]${CLIENTS_IP}:/tmp/${CLIENTS_IP}* /tmp/ 
match_max 50000 
    expect { 
    "*yes/no*" { 
    send -- "yes\r" 
    send -- "\r" 
    exp_continue 
} 
    "*?assword:*" { 
    send -- "${CLIENT_PASSWORD}\r" 
    send -- "\r" 
    } 
} 
expect eof 
EndMark 
} 

get_list_of_clients 

=========================================== ===================================== 請幫忙。

回答

0

這不是一個真正的答案,試圖幫助你獲得自己的。

的問題

如果我理解正確的話:

  1. 腳本中的服務器
  2. 你有三個客戶,每個人都有日誌文件上運行
  3. 你的客戶名單是在文件名爲$CLIENT_IP_LIST,其中IP是第三個字段,第一行是某種您想要排除的標題。

建議

  • 看來你需要SSHSCP到客戶端。如果可能,我建議在您的服務器和客戶端之間設置SSH Public Key Authentication。這將大大簡化您的腳本。
  • 使用-C標誌進行壓縮,其中scpssh命令。
  • 您應該將日誌文件從客戶端複製到服務器並在服務器上進行處理。
  • 如果你可以選擇不同的腳本語言如Python的的Tcl(你以前期待,這實在是Tcl的)。 Bash可以處理你的問題,但你會發現其他語言更好地工作。當然,這是我的看法。
  • 在開始下一步工作之前,獲取一塊難題。例如,現在,您的get_list_of_clients()函數尚未運行。

話雖這麼說,這裏是get_list_of_clients重寫,這是我測試和它的作品我的假設中有關$CLIENT_IP_LIST文件:

function get_list_of_clients() { 
    let row=1 
    while read line 
    do 
     if ((row > 1)) 
     then 
      set $line # Breaks line into pieces 
      CLIENT_IP="$3" 
      echo "$CLIENT_IP" 
     fi 
     let row=row+1 
    done < $CLIENT_IP_LIST 
} 
+0

感謝海武爲你提供建議。 我還有另一個查詢,我試圖在一個變量中存儲 $(spawn ssh root @ $ {CLIENTS_IP}「grep $ {error [$ row_no]} /var/error.log | wc -l」)的值var var = $(spawn ssh root @ $ {CLIENTS_IP}「grep $ {error [$ row_no]} /var/error.log | wc -l」)&然後嘗試回顯var,但它發生了。 你可以建議任何方式將$(spawn ssh root @ $ {CLIENTS_IP}「grep $ {error [$ row_no]} /var/error.log | wc -l」) 的值存儲在一個變量中。如果發生這種情況,我想我可以通過它。 – user3406322