Linux Ping хост, ошибка отображения при сбое

Я пишу сценарий bash, чтобы пропинговать заданное имя хоста и показать, активен ли хост (отобразить простое сообщение.) Должно быть легко, но вместо этого головная боль.
Вот что у меня есть до сих пор:

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

вот вывод:


Успешный пинг (&ответить), он отвечает:

    74.125.226.119 is up

однако, на отказ получить ответ он все еще отвечает:

    ping: unknown host google.ccccaa 
    is up

, а не Эхо "узел вниз"

очевидно, у меня что-то упустил. Я ненавижу задавать такие вопросы, и я уверен, что ответ уже скрывается где-то здесь, но снова я нахожусь в тупике и не могу найти то, что ищу. Я даже не совсем уверен, что именно я ищу.

EDIT: решено! Большое спасибо за полезный совет!

в итоге:

    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>/dev/null )  
       echo "$input ($ip) is up";  
    else  
       echo "Host not found";  
    fi  
    sleep 60  
18
задан fixer1234
29.11.2022 11:15 Количество просмотров материала 3247
Распечатать страницу

2 ответа

во-первых, вы должны добавить 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 }')  
    echo "$ip is up";
else
    echo "host is down";
fi
5
отвечен Sergey Vlasov 2022-11-30 19:03

Я думаю awk не надо. Если я не пропущу что-то, что код должен сделать трюк:

#!/bin/bash

host=
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
отвечен mpy 2022-11-30 21:20

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх