POSIX방법

POSIX방법

ping방금 이 명령이 cygwin에서 항상 0 종료 코드를 반환한다는 것을 알았습니다 .

저는 패키지로 설치했어요 ping.

실제 출력:

$ ping 192.168.0.102 -c 1
PING 192.168.0.102 (192.168.0.102): 0 data bytes
36 bytes from 192.168.0.11: icmp_type=3 (Dest Unreachable) icmp_code=1

----192.168.0.102 PING Statistics----
1 packets transmitted, 0 packets received, 100.0% packet loss

vlastimil@vb-nb-windows ~
$ echo $?
0

예상 출력:

$ echo $?
1

이 패키지에는 질문에 설명된 대로 동작하는 ping비표준 버전의 명령이 포함되어 있습니다 .ping

이 패키지를 제거하고 설치를 시도했지만 명령 inetutils이 없는 것 같습니다 ping.

이 문제를 어떻게 해결할 수 있나요? (포장지 등)

편집 1:

이식성을 위해 답변은 POSIX로 작성되어야 합니다. 죄송해요 깜빡했어요.

답변1

POSIX방법


Cygwin 특정 방식(래퍼)

# Using ping utility from ping package
# This utility seems to always return 0 exit code
is_host_online_cygwin()
{
    ping_output_raw=$(ping "$1" 64 1)
    ! echo "$ping_output_raw" | grep 'Dest Unreachable' > /dev/null 2>&1
}

Windows 특정 방법(래퍼) [콘테스트 우승자]

# Using built-in ping utility
# This utility seems to always return 0 exit code
is_host_online_windows()
{
    ping_output_raw=$(ping -n 1 "$1")
    ! echo "$ping_output_raw" | grep 'Destination host unreachable' > /dev/null 2>&1
}

Linux 특정 방법(직접)

# Using ping utility from iputils-ping package
# This utility returns the right exit code, there is no need for a wrapper
is_host_online_linux()
{
    ping -c 1 "$1" > /dev/null 2>&1
}

노트

  • 나는 이 솔루션이 지금까지는 이상적이지 않다는 것을 알고 있지만 작동합니다.

  • 이러한 기능은 실제로 명령으로 사용하는 프로그램이 무엇인지 알아낸 후에 간단히 실행할 수 있습니다 ping. 비록 이 Q&A의 범위를 벗어나는 내용이지만 힌트를 드리겠습니다.

    command -v ping
    
  • 저는 ping이 패키지를 Cygwin에서 제거하고 is_host_online_windows()Cygwin 프로그램보다 빠르기 때문에 사용하기로 결정했습니다.

  • is_host_online_linux()이 질문과 관련이 없지만 완전성을 위해 포함하고 있습니다 .

관련 정보