Bash: 如何在不使用任何文件的情况下测试 ping 的标准输出

Bash: how to test stdout of a ping without using any file

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

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

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

干杯

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

使用pingreturn代码判断机器状态。

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

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

您可以在 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

只需检查 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

您可以像这样与 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}'