파이썬에서는 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
.
설명
이 명령은 ping
Windows 및 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를 올바르게 설정하지 않음)을 가지고 있었고 많은 수의 주소 핑을 처리하지 못했습니다.