파일에서 IP 핑

파일에서 IP 핑

내 파일에는 다음 데이터가 포함되어 있습니다. 스크립트를 사용하여 구문 분석하고 ping을 수행하고 출력을 표시하고 있습니다. 스크립트에 몇 가지 문제가 있습니다. 도움을 주십시오.

File.txt에는 다음 데이터가 포함되어 있습니다.

Server          ProdTerminalA   192.168.132.10
Server          ProdTerminalB   192.168.132.11
Server          ProdTerminalC   192.168.132.12
Server          ProdTerminalD   192.168.132.13
Server          DevTerminalA    192.168.131.10
Server          DevTerminalB    192.168.131.11
Server          DevTerminalC    192.168.131.12
Server          DevTerminalD    192.168.131.13
Server          TestTerminalA   192.168.133.10
Server          TestTerminalB   192.168.133.11 
Server          TestTerminalC   192.168.133.12
Server          TestTerminalD   192.168.133.13

DevTerminal을 구문 분석하고 데이터를 구문 분석하여 IP에 ping을 실행했지만 예상한 출력을 얻지 못했습니다.

grep "Dev" file.txt | while read ip; do ping -c2 $ip > /dev/null 2>&1 && echo -en "\t Pinging\n"  || echo -en "\t NotPinging\n"; done

예상 결과는 다음과 같습니다.

DevTerminalA    192.168.131.10  Status (Pinging or NotPinging)
DevTerminalB    192.168.131.11  Status (Pinging or NotPinging)
DevTerminalC    192.168.131.12  Status (Pinging or NotPinging)
DevTerminalD    192.168.131.13  Status (Pinging or NotPinging)

답변1

read공백으로 구분된 각 필드를 자체 변수로 읽을 수 있습니다 .

#!/bin/bash

while read -r class name addr; do
        if [[ $name != Dev* ]]; then
                continue
        fi

        if ping -c 2 "$addr" >/dev/null 2>&1; then
                status=Pinging
        else
                status=NotPinging
        fi

        printf '%s\t%s\tStatus %s\n' "$name" "$addr" "$status"
done

스크립트는 표준 입력 스트림에서 목록을 읽습니다. 원하는 방식으로 출력 형식을 조정할 수 있습니다.

내 LAN에서 테스트:

$ ./script <File.txt
DevTerminalA  192.168.131.10  Status NotPinging
DevTerminalB  192.168.131.11  Status NotPinging
DevTerminalC  192.168.131.12  Status NotPinging
DevTerminalD  192.168.131.13  Status NotPinging

같은 일이지만 다음을 사용합니다 awk.

BEGIN { OFS="\t" }

$2 ~ /^Dev/ {
        if (!system("ping -c 2 " $3 ">/dev/null 2>&1"))
                status="Pinging"
        else
                status="NotPinging"

        print $2, $3, "Status " status
}

여기에는 기술적으로 코드 주입 취약점이 포함되어 있습니다. 세 번째 필드의 문자열은 (단순히 하나 ;또는 다른 셸 명령을 포함하여) 임의의 코드를 실행하도록 설계될 수 있기 때문입니다.

시험:

$ awk -f script File.txt
DevTerminalA  192.168.131.10  Status NotPinging
DevTerminalB  192.168.131.11  Status NotPinging
DevTerminalC  192.168.131.12  Status NotPinging
DevTerminalD  192.168.131.13  Status NotPinging

답변2

나는 이것이 당신이 찾고 있는 것이라고 생각합니다:

#!/bin/bash

grep "Dev" file.txt | while read data; do
   ip=$(awk '{print $3}' <<< "$data")
   name=$(awk '{print $2}' <<< "$data")
   echo -en "$name\t$ip"
   ping -c2 $ip > /dev/null 2>&1 && echo -en "\t Pinging\n"  || echo -en "\t NotPinging\n"; 
done

값을 인쇄하는 대신 또는 Status값을 인쇄합니다 . 전에 인쇄하려면 다음 줄에서 이것을 사용해야 합니다 .PingingNotPingingStatusecho -en "$name\t$ip"

echo -en "$name\t$ip\tStatus"

주요 문제는 $ipIP뿐만 아니라 다음과 같은 내용도 포함하기 때문에 변수입니다.

Server          DevTerminalA    192.168.131.10

그래서 당신은 다음을 사용하고 있습니다 :ping Server DevTerminalA 192.168.131.10

awk겠어요개발 터미널 A( $(awk '{print $2}' <<< "$data")) 그리고192.168.131.10( $(awk '{print $3}' <<< "$data")).

관련 정보