LINUX Ping 主机,失败时显示错误

ICE*_*ICE 4 linux ping hosts

我正在编写一个 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  
Run Code Online (Sandbox Code Playgroud)

这是输出:
Successful ping (& reply),它响应:

    74.125.226.119 is up
Run Code Online (Sandbox Code Playgroud)

但是,在没有收到回复时,它仍然响应:

    ping: unknown host google.ccccaa 
    is up
Run Code Online (Sandbox Code Playgroud)

而不是回声“主机已关闭”

显然,我忽略了一些东西。我讨厌问这样的问题,我确信答案已经藏在这里的某个地方,但我再次陷入停滞,找不到我要找的东西。我什至不确定我在寻找什么。

编辑:解决了!非常感谢您的有用建议!

这是决赛:

    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  
Run Code Online (Sandbox Code Playgroud)

mpy*_*mpy 5

我认为awk没有必要。除非我遗漏了一些代码应该可以解决问题的东西:

#!/bin/bash

host=$1
ping -c1 $host > /dev/null 2> /dev/null
[[ $? == 0 ]] && echo "$host is up" || echo "$host is down/not reachable"
Run Code Online (Sandbox Code Playgroud)

这里有一个例子:

$ ./checkping www.google.com
www.google.com is up
$ ./checkping www.google.utld
www.google.utld is down/not reachable
Run Code Online (Sandbox Code Playgroud)


Ser*_*sov 5

首先,您应该添加2>/dev/nullping调用中,这样来自的错误消息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
Run Code Online (Sandbox Code Playgroud)