Пингует хосты на основе фильтра и возвращает мертвый или активный

Кстати, если вы хотите добавить в конец существующего файла что-то вроде этого, вам не нужно ни sed, ни цикл оболочки. Это всего лишь одна команда:

$ printf '%s\n' "pts/"{0..10} >> /etc/securetty

Если вы хотите вставить в начало файла, вы все равно можете сделать это с помощью printf:

$ cat file1
europe|EU
australia|AU
china|CN
$ printf '%s\n%s\n' "pts/"{0..10} "$(<file1)"
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9
pts/10
europe|EU
australia|AU
china|CN

Вы можете заменить содержимое вашего файла /etc /securetty вот так (даже sed -i выполняет точно такую ​​же работу за кулисами):

$ printf '%s\n%s\n' "pts/"{0..10} "$(</etc/securetty)" > tmpsecure && mv -f tmpsecure /etc/securetty

Альтернатива:

$ { printf '%s\n' "pts/"{0..10}; cat /etc/securetty; } > tmpsecure && mv -f tmpsecure /etc/securetty
# Or
# cat <(printf '%s\n' "pts/"{0..10}) /etc/securetty > tmpsecure && mv tmpsecure /etc/securetty
1
03.07.2019, 13:33
2 ответа

Вы можете использовать код выхода из ping, чтобы определить, был ли ping успешным или нет.

ping HOST -c1 > /dev/null && echo "ALIVE" || echo "DEAD"

Когда хост активен, код выхода равен 0, а для мертвого 1. Чтобы пропинговать каждый хост, вы можете зациклить каждую строку и использовать awk, чтобы получить первый столбец, который содержит адрес/имя хоста.

exec 3<input.txt

while read -u3 line
do
    if [ "$line" == "" ]; then
        # skip empty lines
        continue
    fi

    ping -c1 $(echo "$line"| awk '{print $1}') > /dev/null

    if [ $? = 0 ]; then
        echo "$line=ALIVE"
    else
        echo "$line=DEAD"
    fi
done

РЕДАКТИРОВАТЬ:

Если вы хотите пинговать хост только по одной строке в файле, вы можете выполнить поиск:

# find line for $host, only 1 line
line = grep "$HOST" input.txt |tail -n 1

# $($line |awk '{print $1}') outputs the first column of line (address)
ping -c1 $($line |awk '{print $1}') >/dev/null && echo "$line=ALIVE" || echo "$line=DEAD"
0
28.01.2020, 00:51

Думаю, это сделает то, что вы хотите:

pingme () {
hostfile="/home/jbutryn/test/hostfile.txt"
IFS= mapfile -t  hosts < <(cat $hostfile)
for host in "${hosts[@]}"; do
    match=$(echo "$host" | grep -o "\-$1_" | sed 's/-//' | sed 's/_//')
    if [[ "$match" = "$1" ]]; then
        hostname=$(echo "$host" | awk '{print $2}')
        ping -c1 -W1 $(echo "$host" | awk '{print $1}') > /dev/null
        if [[ $? = 0 ]]; then
            echo "$hostname is alive"
        elif [[ $? = 1 ]]; then
            echo "$hostname is dead"
        fi
    fi
done
}

Вы можете запустить эту функцию, как :pingme UR01, и она должна вернуть что-то вроде:

[root@JBCLAMP001 test]# pingme CC
BB-CC_DD is dead
AA-CC_EE is alive
[root@JBCLAMP001 test]# pingme DD
CC-DD_EE is dead
CC-DD_JJ is alive
0
28.01.2020, 00:51

Теги

Похожие вопросы