[python] 파이썬에서 핑 서버

파이썬에서는 ICMP를 통해 서버를 핑하고 서버가 응답하면 TRUE를 반환하고 응답이 없으면 FALSE를 반환하는 방법이 있습니까?



답변

이 기능은 모든 OS (Unix, Linux, macOS 및 Windows)
Python 2 및 Python 3에서 작동합니다.

편집 :
으로 @radato은 os.system 대체되었다 subprocess.call. 이렇게하면 호스트 이름 문자열의 유효성이 검사되지 않는 경우 쉘 삽입 취약점 이 방지 됩니다.

import platform    # For getting the operating system name
import subprocess  # For executing a shell command

def ping(host):
    """
    Returns True if host (str) responds to a ping request.
    Remember that a host may not respond to a ping (ICMP) request even if the host name is valid.
    """

    # Option for the number of packets as a function of
    param = '-n' if platform.system().lower()=='windows' else '-c'

    # Building the command. Ex: "ping -c 1 google.com"
    command = ['ping', param, '1', host]

    return subprocess.call(command) == 0

Windows의 @ikrase에 따르면 오류가 발생 해도이 함수는 계속 반환 True됩니다 Destination Host Unreachable.

설명

이 명령은 pingWindows 및 Unix 계열 시스템에 있습니다. (Windows) 또는 (Unix)
옵션 은이 예에서 1로 설정된 패킷 수를 제어합니다.-n-c

platform.system()플랫폼 이름을 반환합니다. 전의. 'Darwin'macOS에서.
subprocess.call()시스템 호출을 수행합니다. 전의. subprocess.call(['ls','-l']).


답변

Windows를 지원할 필요가없는 경우 Windows를 지원하는 간결한 방법은 다음과 같습니다.

import os
hostname = "google.com" #example
response = os.system("ping -c 1 " + hostname)

#and then check the response...
if response == 0:
  print hostname, 'is up!'
else:
  print hostname, 'is down!'

연결이 실패하면 ping이 0이 아닌 값을 반환하기 때문에 작동합니다. (실제 값은 네트워크 오류에 따라 다릅니다.) ‘-t’옵션을 사용하여 핑 시간 초과 (초)를 변경할 수도 있습니다. 이것은 콘솔에 텍스트를 출력합니다.


답변

이를 수행 할 수있는 pyping 이라는 모듈 이 있습니다. 핍으로 설치 가능

pip install pyping

사용이 매우 간단하지만이 모듈을 사용할 때는 루트에서 원시 패킷을 작성한다는 사실 때문에 루트 액세스가 필요합니다.

import pyping

r = pyping.ping('google.com')

if r.ret_code == 0:
    print("Success")
else:
    print("Failed with {}".format(r.ret_code))


답변

import subprocess
ping_response = subprocess.Popen(["/bin/ping", "-c1", "-w100", "192.168.0.1"], stdout=subprocess.PIPE).stdout.read()


답변

python3의 경우 매우 간단하고 편리한 python 모듈 ping3이 있습니다 : ( pip install ping3, 루트 권한이 필요 합니다 ).

from ping3 import ping, verbose_ping
ping('example.com')  # Returns delay in seconds.
>>> 0.215697261510079666

이 모듈을 사용하면 일부 매개 변수를 사용자 정의 할 수도 있습니다.


답변

파이썬 프로그램을 버전 2.7 및 3.x와 Linux, Mac OS 및 Windows 플랫폼에서 보편적으로 사용하고 싶기 때문에 기존 예제를 수정해야했습니다.

# shebang does not work over all platforms
# ping.py  2016-02-25 Rudolf
# subprocess.call() is preferred to os.system()
# works under Python 2.7 and 3.4
# works under Linux, Mac OS, Windows

def ping(host):
    """
    Returns True if host responds to a ping request
    """
    import subprocess, platform

    # Ping parameters as function of OS
    ping_str = "-n 1" if  platform.system().lower()=="windows" else "-c 1"
    args = "ping " + " " + ping_str + " " + host
    need_sh = False if  platform.system().lower()=="windows" else True

    # Ping
    return subprocess.call(args, shell=need_sh) == 0

# test call
print(ping("192.168.17.142"))


답변

둘러 본 후 많은 수의 주소를 모니터링하도록 설계된 자체 핑 모듈을 작성했으며 비동기식이며 많은 시스템 리소스를 사용하지 않습니다. https://github.com/romana/multi-ping/에서 찾을 수 있습니다. Apache 라이센스가 부여되어 있으므로 프로젝트에서 원하는대로 사용할 수 있습니다.

내 자신을 구현하는 주요 이유는 다른 접근 방식의 제한 때문입니다.

  • 여기에 언급 된 많은 솔루션은 명령 행 유틸리티에 대한 실행을 요구합니다. 많은 수의 IP 주소를 모니터링해야하는 경우 이는 매우 비효율적이며 리소스가 부족합니다.
  • 다른 사람들은 오래된 파이썬 핑 모듈을 언급합니다. 나는 그것들을보고 결국에는 모두 문제가 있거나 다른 것 (예 : 패킷 ID를 올바르게 설정하지 않음)을 가지고 있었고 많은 수의 주소 핑을 처리하지 못했습니다.