필터를 기반으로 호스트를 핑하고 죽은 상태 또는 살아있는 상태로 반환

필터를 기반으로 호스트를 핑하고 죽은 상태 또는 살아있는 상태로 반환

디렉터리의 텍스트 파일에서 여러 호스트를 ping할 수 있는 스크립트를 만들려고 합니다. 호스트에는 특정 명명 규칙이 있으며 그룹화됩니다. 예를 들어 텍스트 파일에서

10.10.10.10 XX-YY_ZZ name of the host in form of URL 

파일은 CSV가 아니고 txt입니다.

내가 하고 싶은 것은 다음과 같은 결과를 반환하는 간단한 것입니다 . pingme YY( YY특정 위치에 속한 장치 간의 공통 요소는 어디에 있습니까?)

XX-YY_ZZ = ALIVE

아마도 매우 간단할 것입니다. 하지만 우리는 Linux REDHAT을 실행하고 있기 때문에 어떻게 시작해야 할지 모르겠습니다.

어떤 조언이나 아이디어라도 대단히 감사하겠습니다.

답변1

나는 이것이 당신이 원하는 것을 할 것이라고 믿습니다:

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

답변2

종료 코드를 사용하여 pingping의 성공 또는 실패 여부를 확인할 수 있습니다.

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

호스트가 활성화되면 종료 코드는 0이고, 호스트가 종료되면 종료 코드는 1입니다. 각 호스트를 ping하려면 각 행을 반복하여 이를 사용하여 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

편집하다:

파일에서 한 줄만 일치시켜 호스트를 핑하려면 다음과 같이 grep하면 됩니다.

# 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"

관련 정보