題 LINUX Ping主機,顯示失敗時出錯


我正在寫一個bash腳本來ping一個給定的主機名,並顯示主機是否處於活動狀態(顯示一條簡單的消息。)應該很容易,但要頭疼。 這是我到目前為止:

    echo & echo "DOI (Domain):" &&read input 
    ip=$(ping -c 1 $input | gawk -F'[()]' '/PING/{print $2}') 
    if [ $? -eq 0 ]; then  
        echo "$ip is up";  
    else   
        echo "host is down";  
    fi  
    sleep 60  

這是輸出:
成功ping(&reply),它響應:

    74.125.226.119 is up

但是,一旦收到回复失敗,它仍然會回复:

    ping: unknown host google.ccccaa 
    is up

而不是回應“主機已關閉”

顯然,我忽視了一些事情。我討厭這樣的問題,我確定答案已經隱藏在某個地方了,但我又一次陷入停滯,無法找到我想要的東西。我甚至不確定我在尋找什麼。

編輯:解決了!謝謝你的建議!

這是決賽:

    echo & echo "DOI (Domain):" &&read input    
    output=$(ping -c 1 "$input" 2>/dev/null)  
    if [ $? -eq 0 ]; then  
       ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null )  
       echo "$input ($ip) is up";  
    else  
       echo "Host not found";  
    fi  
    sleep 60  

4
2018-06-02 13:10


起源


$? 返回最後一個命令的退出狀態,在你的情況下 gawk 即使是,即使退出也會成功 ping 返回錯誤。 - mpy
首先 ip=$(ping... 不需要。 - Sergey Vlasov


答案:


首先,你應該添加 2>/dev/null 到了 ping 調用,以便從中發出錯誤消息 ping 不會打印到標準錯誤。

第二, $? 在您的代碼中將不包含您期望的結果,因為管道的返回狀態是退出狀態 持續 命令,這是 gawk 在你的情況下,和退出狀態 ping 只是被忽略了。您可以重寫代碼,例如,像這樣:

output=$(ping -c 1 "$input" 2>/dev/null)
if [ $? -eq 0 ]; then
    ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}')  
    echo "$ip is up";
else
    echo "host is down";
fi

5
2018-06-02 13:22





我認為 awk 沒有必要。除非我遺漏了代碼應該做的事情:

#!/bin/bash

host=$1
ping -c1 $host > /dev/null 2> /dev/null
[[ $? == 0 ]] && echo "$host is up" || echo "$host is down/not reachable"

這是一個例子:

$ ./checkping www.google.com
www.google.com is up
$ ./checkping www.google.utld
www.google.utld is down/not reachable

4
2018-06-02 13:18



awk 這裡用來從中獲取IP地址 ping 輸出並打印它而不是主機名。 - Sergey Vlasov
@SergeyVlasov:當然,但我沒有意識到返回IP是一個要求,直到我讀到OP之前的問題(superuser.com/q/602674/195224)。順便說一句。你答案中的好方法(+1)! - mpy
謝謝大家的建議!一切都像XD一樣魅力 - ICE
@Micheal:很好。但我認為(從你的問題來看,在你的問題中最終'謝爾蓋的答案值得接受'。如果你也喜歡我的答案,一旦你有足夠的代表,你就可以回來並提出它 ;) - mpy
它不會讓我贊成任何答案:唉,我只能接受(某些),並評論別人。所以我現在肯定要感謝大家。 15rep? - ICE