Bash:如何在不使用任何文件的情况下测试ping的stdout

时间:2016-04-19 11:36:45

标签: bash ping

我想用脚本检索所有连接的主机:

for i in {1..9}
do 
    ping -c 1 -w 1 8.8.8.$i | grep ' 0%'
done

所以我想使用 if 添加条件,这将测试每个 ping (使用管道 grep )的输出是否为是否为空,如果它不为空,则主机已启动。

干杯

p.s:我想避免使用文件

5 个答案:

答案 0 :(得分:1)

使用ping返回码确定机器的状态。

for i in {1..9}
do
    ping_status=$(ping -c 1 8.8.8.$i &> /dev/null && echo success || echo fail)

    if [ $ping_status = success ]
    then echo 'machine is up and running'
    else
       echo 'machine is down'
    fi
done

答案 1 :(得分:1)

只需检查ping命令的状态:

for i in {1..9}
do 
    if ping -c 1 -w 1 8.8.8.$i >/dev/null; then 
        echo "$i alive"; 
    else 
        echo "$i dead"
    fi
done

答案 2 :(得分:0)

How to set a variable to the output from a command in Bash?

for i in {1..9}
do
    out="$(ping -c 1 -w 1 8.8.8.$i | grep ' 0%')"
    if [ -z "$out" ]; then
        # output empty
    fi
done

答案 3 :(得分:0)

你可以在case / esac中使用glob匹配。这避免了昂贵的前叉grep

for i in {1..9}; do
   case $(ping -c 1 8.8.8.$i) in
   (*" 0%"*)
      echo something
   ;;
   (*)
      echo something else
   ;;
   esac
done

答案 4 :(得分:0)

您可以像GNU Parallel这样快速地执行此操作:

parallel -j 64 -k 'ip=8.8.8.{}; ping -c 1 -t 1 $ip >/dev/null 2>&1; [ $? -eq 0 ] && echo $ip' ::: {1..254}

或者您可以像这样使用nmap

nmap -sP 8.8.8.* | tr -d "()" | awk '/Nmap scan report/{h=$NF} /Host is up/{print h}'