2014-03-05 33 views
0

我有一個名爲「host.txt」與兩個系統列表IP地址的文件。腳本來讀取IP地址和登錄文件

~] cat hosts.txt 
10.1.1.10 
10.1.1.20 

使用下面的腳本我試圖登錄到每個系統,檢查服務的狀態並打印每個系統的輸出。該腳本提示登錄,但不會繼續執行/opt/agent.sh status命令。有人可以幫助解決這個腳本?

#!/bin/bash 
for HOST in `cat hosts.txt` 
do 
ssh [email protected]$HOST 
STATUS=`/opt/agent.sh status | awk 'NR==1{print $3 $4}'` 
echo $STATUS 

if [ $STATUS! == "isrunning" ]; then 
echo "$host == FAIL" 
else 
echo "$host == PASS" 
fi 
+0

你有'ssh'鍵設置啓用密碼減ssh嗎?你的'if'條件不正確,可能你的意思是'[$ {STATUS}!=「isrunning」];' – Amit

+0

沒有涉及ssh密鑰,想手動登錄,然後繼續檢查服務狀態。 if條件實際上是一個錯字。 – user3331975

回答

1

你的腳本不繼續下去,直到ssh命令完成,這不會發生在$HOST交互shell,你開始ssh退出。相反,您想要在$HOST上執行腳本

(另外,還要注意遍歷的hosts.txt內容的正確方法。)

#!/bin/bash 
while read HOST; do 
do 
    if ssh [email protected]$HOST ' 
     STATUS=`/opt/agent.sh status | awk 'NR==1{print $3 $4}'` 
     [ "$STATUS" = "isrunning" ] 
    '; then 
     echo "$HOST == FAIL" 
    else 
     echo "$HOST == PASS" 
    fi 
done < hosts.txt 

遠程腳本簡單地比較$STATUS爲「isrunning」的結果離開。本地主機上的if語句根據該結果輸出一個字符串(這是ssh命令本身的結果)。這節省了必須將$HOST的值傳遞給遠程主機的麻煩,簡化了遠程腳本所需的引用。

+0

在遠程主機上只執行'/ opt/agent.sh'會更簡單:'STATUS = \'ssh root @ $ HOST /opt/agent.sh status | awk'NR == 1 {print $ 3 $ 4}'\''? – jfs

+0

我試過了,但得到以下錯誤。順便說一句,我已經刪除了第二行的額外的做。而且,腳本只能在hosts.txt文件中的第一個IP地址上執行。 awk:cmd。行:1:NR == 1 {print awk:cmd。行:1:^意外的換行符或字符串結尾 bash:行2:[:!= =一元運算符預期 – user3331975

+0

這是agent.sh狀態的輸出。目的是捕捉「正在運行」,它告訴狀態。 #〜] /opt/agent.sh狀態 代理正在運行(PID:24037)。 當前代理程序包:agent-5.0.0 服務器IP地址:10.10.1.100 awk提取正在運行並打印爲結果。有沒有更好的方法來捕捉這個? – user3331975