본문 바로가기

리눅스

ICMP Ping 테스트를 수행하는 Python 스크립트

728x90

ICMP Ping 테스트를 수행하는 Python 스크립트

주어진 서브넷의 호스트에 대해 ICMP Ping 테스트를 수행하는 Python 스크립트입니다.

스크립트 편집

vim check_icmp_ping.py
import sys
import subprocess
import ipaddress

def ping(host):
    """
    주어진 호스트에 대한 ping을 수행하고 결과를 반환합니다.
    """
    try:
        # 플랫폼에 따라 ping 명령어의 형식이 다를 수 있습니다.
        subprocess.run(["ping", "-c", "1", "-W", "1", host], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True)
        return 0  # 성공
    except subprocess.CalledProcessError:
        return 1  # 실패

def main(subnet_input):
    try:
        # 입력받은 서브넷을 이용하여 네트워크 주소 추출
        network = ipaddress.IPv4Network(subnet_input, strict=False)
    except ValueError as e:
        print(f"Error: {e}")
        return

    # ping 테스트 수행
    for host in network.hosts():
        response = ping(str(host))

        # 응답 확인 및 결과 출력
        if response == 0:
            print(f"{host}\tis reachable")
        else:
            print(f"{host}\tis unreachable")

if __name__ == "__main__":
    # 명령행 인수에서 서브넷을 받아옴
    if len(sys.argv) != 2:
        print("Usage: python check_icmp_ping.py <subnet>")
        sys.exit(1)

    subnet_input = sys.argv[1]
    main(subnet_input)
  1. ping 함수 :
    • ping 함수는 주어진 호스트에 대한 ping을 수행하고 결과를 반환합니다.
    • subprocess.run 함수를 사용하여 시스템 명령어를 실행합니다.
    • ping 명령어의 실행이 성공하면 0을 반환하고, 실패하면 1을 반환합니다.
  2. main 함수 :
    • main 함수는 주어진 서브넷에 속하는 호스트에 대해 ping 테스트를 수행합니다.
    • 입력받은 서브넷을 이용하여 네트워크 주소를 추출합니다.
    • 각 호스트에 대해 ping 함수를 호출하여 응답 확인 및 결과를 출력합니다.
  3. 스크립트 실행 부분 :
    • if __name__ == "__main__":은 스크립트가 직접 실행될 때만 코드 블록이 실행되도록 하는 부분입니다.
    • 명령행에서 서브넷을 받아오고, main 함수를 호출하여 스크립트의 주요 동작을 수행합니다.
  4. 명령행 인수 처리 :
    • sys.argv를 사용하여 명령행 인수를 처리합니다.
    • 필요한 명령행 인수의 개수가 맞지 않으면 사용 방법을 출력하고 프로그램을 종료합니다.
  5. 서브넷 처리 :
    • ipaddress.IPv4Network를 사용하여 입력받은 서브넷을 이용하여 네트워크 객체를 생성합니다.
    • 이때 strict=False로 설정하여 서브넷의 주소 범위를 얻습니다.
  6. 호스트 반복 :
    • network.hosts()를 사용하여 서브넷에 속하는 모든 호스트를 반복합니다.
    • 각 호스트에 대해 ping 함수를 호출하여 응답 확인하고 결과를 출력합니다.
  7. 결과 출력: 
    • ping 함수의 반환 값에 따라 각 호스트의 상태를 출력합니다.
    • 성공하면 "is reachable", 실패하면 "is unreachable"를 출력하며, 이때 탭 문자(\t)로 아이피와 상태를 구분합니다.
728x90

스크립트 실행

스크립트 실행은 서브넷을 명령행 인수로 전달하여 스크립트를 실행할 수 있습니다.

python check_icmp_ping.py 192.168.10.0/29

스크립트 결과 확인

주어진 서브넷의 호스트에 대해 ICMP Ping 테스트를 수행하고 결과를 출력합니다.

$ python check_icmp_ping.py 192.168.10.0/29
192.168.10.1	is reachable
192.168.10.2	is unreachable
192.168.10.3	is unreachable
192.168.10.4	is unreachable
192.168.10.5	is unreachable
192.168.10.6	is unreachable

리눅스에서 사용할 수 있는 네트워크 계산 도구

ipcalc 명령어를 사용하여 주어진 서브넷에 대한 HostMin, HostMax, 그리고 Hosts/Net을 검증하는 예제입니다.

ipcalc -n 192.168.10.0/29
$ ipcalc -n 192.168.10.0/29
Address:   192.168.10.0         11000000.10101000.00001010.00000 000
Netmask:   255.255.255.248 = 29 11111111.11111111.11111111.11111 000
Wildcard:  0.0.0.7              00000000.00000000.00000000.00000 111
=>
Network:   192.168.10.0/29      11000000.10101000.00001010.00000 000
HostMin:   192.168.10.1         11000000.10101000.00001010.00000 001
HostMax:   192.168.10.6         11000000.10101000.00001010.00000 110
Broadcast: 192.168.10.7         11000000.10101000.00001010.00000 111
Hosts/Net: 6                     Class C, Private Internet
  • HostMin : 서브넷에서 사용 가능한 첫 번째 호스트의 IP 주소입니다.
  • HostMax : 서브넷에서 사용 가능한 마지막 호스트의 IP 주소입니다.
  • Hosts/Net : 해당 서브넷에서 사용 가능한 호스트의 총 수입니다.

 

728x90