Bash AWK 또는 IF 문

Bash AWK 또는 IF 문

변수의 숫자를 확인한 다음 출력을 생성하는 스크립트를 만들려고 합니다. 즉, ping을 사용하고 tty를 기반으로 Linux 또는 Windows를 실행하는지 확인합니다. 일이 너무 복잡해질 수도 있지만 이것이 내가 얻은 것입니다.

#!/bin/bash
var1=$(ping $1 -c 1) | awk '{if("$var1"=="128") print "Host is LIVE Running: Windows OS"}'

출력을 생성하지 않습니다. awk를 사용하지 않고 IF 문을 사용해 보았는데, 연결할 수 없는 것으로 알고 있는 IP를 입력하면 출력이 생성되지 않습니다.

#!/bin/bash
var1=$(ping $1 -c 1)
if [[ "$var1" == *"128"* ]]; then
echo "Host is LIVE Running: Windows OS"
elif [[ "$var1" == *"64"* ]]; then
echo "Host is LIVE Running: Linux OS"
elif [[ "$var1" == *"Unreachable"* ]]; then
echo "Host appears DOWN!"
fi

건설적인 비판을 환영합니다! 감사해요.

답변1

awk환경에서 변수를 사용하려면 변수를 설정해야 합니다 . 이와 같이:

var1=$(ping $1 -c 1) ; awk -v var2=$var1 '{if(var2 == 128)....

숫자를 비교할 때는 bash다음을 사용해야 합니다.

if [[ "$var1" -eq *"128"* ]]; then...

=문자열의 경우 및 AFAIK를 bash모두 사용할 수 있습니다 . 이는 동일한 의미입니다(에서 ).===if

답변2

스크립트가 작동하지 않는 몇 가지 이유는 다음과 같습니다.

  1. $var1awk 내부에는 쉘 변수가 없습니다.
  2. 그렇더라도 "$var1"awk에서는 여러분이 생각하는 것을 의미하지 않습니다. 리터럴 텍스트이므로 $var1따옴표 없이는 변수 값으로 필드 번호를 간접적으로 지정합니다 var1(예: var1이 2와 같으면 field2에 $2가 입력됩니다). awk에서 초기화되지 않은 변수의 값은 0이므로 $0 또는 전체 입력 줄이 됩니다.
  3. $var1pingBash에는 ttl 값뿐만 아니라 명령의 전체 출력이 포함됩니다 .
  4. ICMP 에코 응답 패킷의 TTL 값을 사용하여 원격 호스트의 운영 체제를 확인하는 것은 신뢰할 수 없는 방법입니다. Windows는 TTL 128을 사용하는 유일한 운영 체제가 아닙니다(모든 Windows 버전이 128을 사용하는 것도 아닙니다).

답변3

완료되었습니다. 지원해 주셔서 감사합니다. 이 코드는 언뜻 보기에 어떤 운영 체제인지 더 잘 알 수 있도록 도와줍니다.

#!/bin/bash
var1=$(ping $1 -c 1 -W 3 | grep "64 bytes" | cut -d " " -f 6)
if [[ "$var1" -eq "ttl=63" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=64" ]]; then
echo "Host is LIVE! Most likely running: Linux OS"
elif [[ "$var1" -eq "ttl=127" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=128" ]]; then
echo "Host is LIVE! Most likely running: Windows OS"
elif [[ "$var1" -eq "ttl=31" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=32" ]]; then
echo "Host is LIVE! Most likely running: Windows 95 OS"
elif [[ "$var1" -eq "ttl=255" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" -eq "ttl=254" ]]; then
echo "Host is LIVE! Most likely running: MAC / OPENBSD / CISCO / SOLARIS OS"
elif [[ "$var1" == "" ]]; then
echo "Host appears to be DOWN!"
fi

관련 정보