파이썬에서 핑 서버


답변:


112

이 기능은 모든 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']).


14
다른 호스트에서 "대상 호스트에 연결할 수 없음"응답을 받으면 여전히 Windows에서 true를 반환합니다.
ikrase

모뎀이 꺼져있을 때 가끔 핑 성공을 거둘 수 있다는 것을 알고 있습니다. ?? Windows 10 OS에서 "8.8.8.8"및 "google.com"을 테스트하고 있습니다. 뭔가 잘못되었습니다.
Markus

@Markus에서는 일어날 수 없습니다. 위 코드의 수정 된 버전으로 직접 테스트하고 결과를 알려주십시오. 직접 : 1) cmd 2) ping 8.8.8.8 -n 13)을 엽니 다 echo %ERRORLEVEL%. 코드 : Python 코드의 마지막 줄을로 수정하십시오 return system_call(command). 제대로 연결되면 0이됩니다. 모뎀을 끈 상태에서 오류 코드가 표시되어야합니다. 물론 두 조건 모두 동일한 조건에서 동일한 오류 코드를 반환해야합니다.
ePi272314

그것은 일어나고 나는 정확한 코드 인 단어를 사용하고있었습니다. 나는 당신의 의견을 이해하고 믿습니다. 연결이 없을 때 명령 줄 핑이 성공 할 수있는 방법이 없으므로 파이썬에서 명령 줄 작업에 문제가 있다고 생각합니다. 업데이트를 시도하고 어떻게 진행되는지 보겠습니다. 감사.
Markus

@Markus는 ikrase의 의견을 참조하십시오.
보리스

163

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'옵션을 사용하여 핑 시간 초과 (초)를 변경할 수도 있습니다. 이것은 콘솔에 텍스트를 출력합니다.


42
나는이 변종으로 끝났다response = os.system("ping -c 1 -w2 " + hostname + " > /dev/null 2>&1")
MGP

4
@ jeckyll2hide man ping, 데드 라인이 2 초인 단 하나의 패킷을 보내고 모든 출력을 / dev / null로 리디렉션하고 반환 값만 검색하십시오.
MGP

@ManuelGutierrez 나는 당신이 "-W 2000"(2000 밀리 초 후에 타임 아웃)을 원하고 아마도 "-t 3"(3 초 후에 종료한다)
eludom

1
-w 및 -W는 밀리 초가 아닌 초 단위의 값을 갖습니다. 확인 man ping하십시오.
Alan Turing

7
hostname사용자로부터 문자열을 받으면 다음 과 같은 "url"을 제공하여 서버를 쉽게 해킹 할 수 있습니다 'google.com; rm -rf /*'. subprocess.run(["ping", "-c", "1", hostname]).returncode대신 사용하십시오 .
보리스

38

이를 수행 할 수있는 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))

4
"ICMP 메시지는 루트로 실행중인 프로세스에서만 보낼 수 있습니다 (Windows에서는이 스크립트를 '관리자'로 실행해야합니다)."
Ben Hyde

1
전송 된 ICMP 요청의 시간 초과 및 개수를 지정할 수 있습니다. 로컬 서브넷의 모든 호스트를 검색하는 스크립트를 작성할 수있었습니다. os.system('ping -c 1 -t 1 hostname')솔루션을 사용하여 255 초 대신 1 초 안에 실행됩니다 . 또한 pypinglib는 TCP / IP 소켓 라이브러리를 사용하는 것에 비해 사용이 매우 쉽습니다. pyping내 생각에, 특히 TCP / IP 소켓 라이브러리 사용에 익숙하지 않은 경우 두 가지를 모두 사용하여 핑 프로그램을 작성했으며 훨씬 빠르고 사용하기 쉽습니다.
MikeyE

10
py3에서는 작동하지 않습니다. ModuleNotFoundError : 'core'라는 모듈이 없습니다
alireza

2
'핵심'오류는 python3과의 비 호환성에서 비롯됩니다. python3에 대해 수정하려고했지만 지속적으로 오류가 계속 발생합니다. 작성자 및 프로젝트 github 페이지가 다운되었습니다 (404를 찾을 수 없음). 우리는 스스로 그것을 python3으로 포팅해야한다 :-)
Andre

6
python3 들어 ping3 : github.com/kyan001/ping3 pip install ping3
beep_check

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

6
이것의 유일한 문제는 Windows에서 작동하지 않는다는 것입니다.
Kudu

8
이와 같은 것이 필요한 이유는 ICMP에 root가 필요하고 / bin / ping이 SUID로 설정되어이 문제를 해결하기 때문입니다.
Catskul

1
참고 : 핑이 다른 위치에 있으면 실패 할 수 있습니다. whereis ping올바른 경로를 얻는 데 사용하십시오 .
octern

4
이것은 Windows에서 작동합니다 :ping_response = subprocess.Popen(["ping", hostname, "-n", '1'], stdout=subprocess.PIPE).stdout.read()
Victor Lellis

1
Windows에서 응답이 정상인지 ko인지 확인하기 위해 결과를 어떻게 구문 분석 할 수 있습니까?
Pitto

15

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

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

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


2
편집 된 루트 권한이 필요하므로 여기를 들어 올리는 것에 대한 토론 : github.com/kyan001/ping3/issues/10
Dimitrios Mistriotis

1
아, 설치뿐만 아니라 실행을 위해서도 루트 권한이 필요합니다 : ping ( "example.com")
Clock ZHONG

14

파이썬 프로그램을 버전 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"))

1
대신 False if platform.system().lower()=="windows" else True당신은 물론 사용할 수도 있습니다 platform.system().lower() != "windows".
Frerich Raabe 님이

os.name!="nt"작동 하지 않습니까? 분명히 모든 ver / 플랫폼 콤보에서 시도하지 않았습니다!
Keeely

2
필자의 경우 기본 게이트웨이는 '도달 할 수없는'메시지를 반환하지만 windows ping 명령의 반환 코드는 여전히 0입니다. 따라서이 방법은 작동했습니다 (기능 선언을 포함한 6 줄의 형식에 대해서는 죄송합니다. def ping(host): process = subprocess.Popen(["ping", "-n", "1",host], stdout=subprocess.PIPE, stderr=subprocess.PIPE) streamdata = process.communicate()[0] if 'unreachable' in str(streamdata): return 1 return process.returncode
wellspokenman

@wellspokenman unreachable파이프에있는 경우 오히려 0을 반환 합니다. 아니요?
beeb

1
@beeb 그래, 나도 그렇게했지만 의견을 업데이트하는 것을 잊었다. 이 같은 내 현재 함수 외모 : pastebin.com/FEYWsVjK
wellspokenman

8

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

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

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

좋은 직업 친구! 누군가가 실제로 그것을보고 싶다면 github.com/romana/multi-ping/blob/master/demo.py를
Cucu

7
#!/usr/bin/python3

import subprocess as sp

def ipcheck():
    status,result = sp.getstatusoutput("ping -c1 -w2 " + str(pop))
    if status == 0:
        print("System " + str(pop) + " is UP !")
    else:
        print("System " + str(pop) + " is DOWN !")


pop = input("Enter the ip address: ")
ipcheck()

이 코드에는 질문에 대한 답변이있을 수 있지만 코드에서 문제를 해결하는 방법에 대한 설명이나 설명을 추가하면 도움이됩니다.
skrrgwasme

5

파이핑 설치 확인 또는 pip install pyping 설치

#!/usr/bin/python
import pyping

response = pyping.ping('Your IP')

if response.ret_code == 0:
    print("reachable")
else:
    print("unreachable")

1
감사! 그러나이 코드를 루트로 실행해야 작동합니다.
토마스

1
Pyping의 GitHub의 페이지가 더 이상 존재하지 않습니다PyPI 패키지는 2016 년 이후 업데이트되지 않은
Stevoisiak

다음 오류가 발생했습니다. import pyping Traceback (가장 최근 호출) : <module> File "/usr/local/lib/python3.6/dist-packages/pyping/__init__의"<stdin> "파일, 1 행. py ", 3 행, 코어 가져 오기의 <module> * ModuleNotFoundError : 'core'라는 모듈 없음
Clock ZHONG

5

원시 ICMP 패킷을 전송하는 데 필요한 높은 권한으로 인해 프로그래밍 방식의 ICMP 핑이 복잡하고 ping이진을 호출하기 가 어렵습니다. 서버 모니터링의 경우 TCP ping 이라는 기술을 사용하여 동일한 결과를 얻을 수 있습니다 .

# pip3 install tcping
>>> from tcping import Ping
# Ping(host, port, timeout)
>>> ping = Ping('212.69.63.54', 22, 60)
>>> ping.ping(3)
Connected to 212.69.63.54[:22]: seq=1 time=23.71 ms
Connected to 212.69.63.54[:22]: seq=2 time=24.38 ms
Connected to 212.69.63.54[:22]: seq=3 time=24.00 ms

내부적으로 이것은 단순히 대상 서버에 대한 TCP 연결을 설정하고 즉시 삭제하여 경과 시간을 측정합니다. 이 특정 구현은 닫힌 포트를 처리하지 않지만 자체 서버의 경우 잘 작동한다는 점에서 약간 제한적입니다.


4
#!/usr/bin/python3

import subprocess as sp

ip = "192.168.122.60"
status,result = sp.getstatusoutput("ping -c1 -w2 " + ip)

if status == 0: 
    print("System " + ip + " is UP !")
else:
    print("System " + ip + " is DOWN !")

3

나는 이것을 다음과 같이 해결한다 :

def ping(self, host):
    res = False

    ping_param = "-n 1" if system_name().lower() == "windows" else "-c 1"

    resultado = os.popen("ping " + ping_param + " " + host).read()

    if "TTL=" in resultado:
        res = True
    return res

"TTL" 은 핑이 올바른지 확인하는 방법입니다. 살루 도스


3

이 게시물의 답변에서 아이디어를 사용하지만 새로운 권장 하위 프로세스 모듈과 python3 만 사용하여 축소했습니다.

import subprocess
import platform

operating_sys = platform.system()
nas = '192.168.0.10'

def ping(ip):
    # ping_command = ['ping', ip, '-n', '1'] instead of ping_command = ['ping', ip, '-n 1'] for Windows
    ping_command = ['ping', ip, '-n', '1'] if operating_sys == 'Windows' else ['ping', ip, '-c 1']
    shell_needed = True if operating_sys == 'Windows' else False

    ping_output = subprocess.run(ping_command,shell=shell_needed,stdout=subprocess.PIPE)
    success = ping_output.returncode
    return True if success == 0 else False

out = ping(nas)
print(out)

1
True if condition else False조건에 따라 True 또는 False를 반환하는 데 사용할 필요는 없습니다 . 그냥 사용 예 shell_needed = operating_sys == 'Windows'return success == 0
emorris

2

이 스크립트는 Windows에서 작동하며 다른 OS에서도 작동합니다. Windows, Debian 및 macosx에서 작동하며 solaris에 대한 테스트가 필요합니다.

import os
import platform


def isUp(hostname):

    giveFeedback = False

    if platform.system() == "Windows":
        response = os.system("ping "+hostname+" -n 1")
    else:
        response = os.system("ping -c 1 " + hostname)

    isUpBool = False
    if response == 0:
        if giveFeedback:
            print hostname, 'is up!'
        isUpBool = True
    else:
        if giveFeedback:
            print hostname, 'is down!'

    return isUpBool

print(isUp("example.com")) #Example domain
print(isUp("localhost")) #Your computer
print(isUp("invalid.example.com")) #Unresolvable hostname: https://tools.ietf.org/html/rfc6761
print(isUp("192.168.1.1")) #Pings local router
print(isUp("192.168.1.135")) #Pings a local computer - will differ for your network

좋은 대답입니다. 여기에는 Windows에 대한 관리자 권한이 필요하지 않습니다.
mountainclimber

오전 중 하나의 방법은 진정한받는 옳고 그름 IP 모두
요아스

그래, 이것은 확실히 작동하지 않습니다. Windows에서 어느 쪽이든 : "true"를 반환합니다.
MKANET

2

비슷한 시나리오와 관련 하여이 질문을 찾았습니다. 나는 ping을 시도했지만 Naveen의 예제는 Python 2.7의 Windows에서 작동하지 않았습니다.

나를 위해 일한 예는 다음과 같습니다.

import pyping

response = pyping.send('Your IP')

if response['ret_code'] == 0:
    print("reachable")
else:
    print("unreachable")

1
pyping표준 모듈이 아닌 것 같습니다. 아마도 당신은 링크를 제공 할 수 있습니까?
Mawg는

2

멀티 핑 ( pip install multiPing)을 사용 하여이 간단한 코드를 만들었습니다 (원하는 경우 복사하여 붙여 넣기! ).

from multiping import MultiPing

def ping(host,n = 0):
    if(n>0):
        avg = 0
        for i in range (n):
            avg += ping(host)
        avg = avg/n
    # Create a MultiPing object to test hosts / addresses
    mp = MultiPing([host])

    # Send the pings to those addresses
    mp.send()

    # With a 1 second timout, wait for responses (may return sooner if all
    # results are received).
    responses, no_responses = mp.receive(1)


    for addr, rtt in responses.items():
        RTT = rtt


    if no_responses:
        # Sending pings once more, but just to those addresses that have not
        # responded, yet.
        mp.send()
        responses, no_responses = mp.receive(1)
        RTT = -1

    return RTT

용법:

#Getting the latency average (in seconds) of host '192.168.0.123' using 10 samples
ping('192.168.0.123',10)

단일 샘플을 원하면 두 번째 매개 변수 "10 "를 무시할 수 있습니다!

그것이 도움이되기를 바랍니다!


4
멋진 라이브러리이지만 루트 권한이 필요합니다.
Craynic Cai

2

내 핑 기능 버전 :

  • Python 3.5 이상, Windows 및 Linux에서 작동합니다 (Mac에서는 작동하지만 테스트 할 수는 없음).
  • Windows에서 "대상 호스트에 연결할 수 없음"으로 ping 명령이 실패하면 False를 반환합니다.
  • 팝업 창이나 명령 줄에 출력을 표시하지 않습니다.
import platform, subprocess

def ping(host_or_ip, packets=1, timeout=1000):
    ''' Calls system "ping" command, returns True if ping succeeds.
    Required parameter: host_or_ip (str, address of host to ping)
    Optional parameters: packets (int, number of retries), timeout (int, ms to wait for response)
    Does not show any output, either as popup window or in command line.
    Python 3.5+, Windows and Linux compatible (Mac not tested, should work)
    '''
    # The ping command is the same for Windows and Linux, except for the "number of packets" flag.
    if platform.system().lower() == 'windows':
        command = ['ping', '-n', str(packets), '-w', str(timeout), host_or_ip]
        # run parameters: capture output, discard error messages, do not show window
        result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, creationflags=0x08000000)
        # 0x0800000 is a windows-only Popen flag to specify that a new process will not create a window.
        # On Python 3.7+, you can use a subprocess constant:
        #   result = subprocess.run(command, capture_output=True, creationflags=subprocess.CREATE_NO_WINDOW)
        # On windows 7+, ping returns 0 (ok) when host is not reachable; to be sure host is responding,
        # we search the text "TTL=" on the command output. If it's there, the ping really had a response.
        return result.returncode == 0 and b'TTL=' in result.stdout
    else:
        command = ['ping', '-c', str(packets), '-w', str(timeout), host_or_ip]
        # run parameters: discard output and error messages
        result = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        return result.returncode == 0

자유롭게 사용하십시오.


1

충분히 단순 해 보이지만 나에게 적합했습니다. "icmp open socket operation not allowed"가 계속 표시되거나 서버가 오프라인 상태 인 경우 솔루션이 중단됩니다. 그러나 알고 싶은 것은 서버가 활성 상태이고 해당 서버에서 웹 서버를 실행하고 있다면 curl이 작업을 수행한다는 것입니다. ssh와 인증서가 있으면 ssh와 간단한 명령으로 충분합니다. 코드는 다음과 같습니다.

from easyprocess import EasyProcess # as root: pip install EasyProcess
def ping(ip):
    ping="ssh %s date;exit"%(ip) # test ssh alive or
    ping="curl -IL %s"%(ip)      # test if http alive
    response=len(EasyProcess(ping).call(timeout=2).stdout)
    return response #integer 0 if no response in 2 seconds

1

비슷한 요구 사항이 있었으므로 아래에 표시된 것처럼 구현했습니다. Windows 64 비트 및 Linux에서 테스트되었습니다.

import subprocess
def systemCommand(Command):
    Output = ""
    Error = ""     
    try:
        Output = subprocess.check_output(Command,stderr = subprocess.STDOUT,shell='True')
    except subprocess.CalledProcessError as e:
        #Invalid command raises this exception
        Error =  e.output 

    if Output:
        Stdout = Output.split("\n")
    else:
        Stdout = []
    if Error:
        Stderr = Error.split("\n")
    else:
        Stderr = []

    return (Stdout,Stderr)

#in main
Host = "ip to ping"
NoOfPackets = 2
Timeout = 5000 #in milliseconds
#Command for windows
Command = 'ping -n {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
#Command for linux 
#Command = 'ping -c {0} -w {1} {2}'.format(NoOfPackets,Timeout,Host)
Stdout,Stderr = systemCommand(Command)
if Stdout:
   print("Host [{}] is reachable.".format(Host))
else:
   print("Host [{}] is unreachable.".format(Host))

IP에 도달 할 수없는 경우 subprocess.check_output ()은 예외를 발생시킵니다. 출력 라인 'Packets : Sent = 2, Received = 2, Lost = 0 (0 % loss)'에서 정보를 추출하여 추가 검증을 수행 할 수 있습니다.


1

다음 은 기본 OS에서 제공하는 Python subprocess모듈 및 pingCLI 도구를 사용하는 솔루션 입니다. Windows 및 Linux에서 테스트되었습니다. 네트워크 시간 초과 설정을 지원합니다. 루트 권한이 필요하지 않습니다 (적어도 Windows 및 Linux에서는).

import platform
import subprocess

def ping(host, network_timeout=3):
    """Send a ping packet to the specified host, using the system "ping" command."""
    args = [
        'ping'
    ]

    platform_os = platform.system().lower()

    if platform_os == 'windows':
        args.extend(['-n', '1'])
        args.extend(['-w', str(network_timeout * 1000)])
    elif platform_os in ('linux', 'darwin'):
        args.extend(['-c', '1'])
        args.extend(['-W', str(network_timeout)])
    else:
        raise NotImplemented('Unsupported OS: {}'.format(platform_os))

    args.append(host)

    try:
        if platform_os == 'windows':
            output = subprocess.run(args, check=True, universal_newlines=True).stdout

            if output and 'TTL' not in output:
                return False
        else:
            subprocess.run(args, check=True)

        return True
    except (subprocess.CalledProcessError, subprocess.TimeoutExpired):
        return False

0

이것을 사용하면 파이썬 2.7에서 테스트되었으며 성공하면 핑 시간을 밀리 초 단위로 반환하고 실패하면 False를 반환합니다.

import platform,subproccess,re
def Ping(hostname,timeout):
    if platform.system() == "Windows":
        command="ping "+hostname+" -n 1 -w "+str(timeout*1000)
    else:
        command="ping -i "+str(timeout)+" -c 1 " + hostname
    proccess = subprocess.Popen(command, stdout=subprocess.PIPE)
    matches=re.match('.*time=([0-9]+)ms.*', proccess.stdout.read(),re.DOTALL)
    if matches:
        return matches.group(1)
    else: 
        return False

0

많은 답변이 놓친 것 중 하나는 (적어도 Windows에서는) ping 에서는" "대상 호스트에 연결할 수 없음"응답이 수신되면 명령이 0 (성공을 나타냄)을 반환한다는 것입니다.

다음은 b'TTL='핑이 호스트에 도달했을 때만 존재하기 때문에 응답에 있는지 확인하는 코드입니다 . 참고 :이 코드의 대부분은 다른 답변을 기반으로합니다.

import platform
import subprocess

def ping(ipAddr, timeout=100):
    '''
    Send a ping packet to the specified host, using the system ping command.
    Accepts ipAddr as string for the ping destination.
    Accepts timeout in ms for the ping timeout.
    Returns True if ping succeeds otherwise Returns False.
        Ping succeeds if it returns 0 and the output includes b'TTL='
    '''
    if platform.system().lower() == 'windows':
        numFlag = '-n'
    else:
        numFlag = '-c'
    completedPing = subprocess.run(['ping', numFlag, '1', '-w', str(timeout), ipAddr],
                                   stdout=subprocess.PIPE,    # Capture standard out
                                   stderr=subprocess.STDOUT)  # Capture standard error
    # print(completedPing.stdout)
    return (completedPing.returncode == 0) and (b'TTL=' in completedPing.stdout)

print(ping('google.com'))

참고 : 출력을 인쇄하는 대신 출력을 캡처하므로의 출력을 보려면 반환하기 전에 ping인쇄해야합니다 completedPing.stdout.


0

WINDOWS 만 해당-아무도 금방 열릴 수 없음 Win32_PingStatus 간단한 WMI 쿼리를 사용하여 무료로 정말 자세한 정보로 가득 찬 개체를 반환합니다.

import wmi


# new WMI object
c = wmi.WMI()

# here is where the ping actually is triggered
x = c.Win32_PingStatus(Address='google.com')

# how big is this thing? - 1 element
print 'length x: ' ,len(x)


#lets look at the object 'WMI Object:\n'
print x


#print out the whole returned object
# only x[0] element has values in it
print '\nPrint Whole Object - can directly reference the field names:\n'
for i in x:
    print i



#just a single field in the object - Method 1
print 'Method 1 ( i is actually x[0] ) :'
for i in x:
    print 'Response:\t', i.ResponseTime, 'ms'
    print 'TTL:\t', i.TimeToLive


#or better yet directly access the field you want
print '\npinged ', x[0].ProtocolAddress, ' and got reply in ', x[0].ResponseTime, 'ms'

샘플 출력


0

다른 답변에서 차용합니다. 쿼리를 단순화하고 최소화하려고합니다.

import platform, os

def ping(host):
    result = os.popen(' '.join(("ping", ping.param, host))).read()
    return 'TTL=' in result

ping.param = "-n 1" if platform.system().lower() == "windows" else "-c 1"

0

더 빠른 핑 스윕이 필요했고 외부 라이브러리를 사용하고 싶지 않았으므로 내장을 사용하여 동시성을 사용하기로 결정했습니다 asyncio.

이 코드에는 python 3.7 이상이 필요 하며 Linux 에서만 작성되고 테스트되었습니다 . Windows에서는 작동하지 않지만 Windows에서 작동하도록 쉽게 변경할 수 있습니다.

나는 전문가가 asyncio아니지만이 위대한 기사 동시성으로 파이썬 프로그램 속도 향상 향상을 사용했으며 이러한 코드 줄을 생각해 냈습니다. 가능한 한 간단하게 만들려고 했으므로 필요에 맞게 코드를 더 추가해야 할 가능성이 큽니다.

true 또는 false를 반환하지 않습니다. Ping 요청에 응답하는 IP를 인쇄하는 것이 더 편리하다고 생각했습니다. 꽤 빠르다고 생각합니다. 핑거의 10 초 안에 255 ips를 .

#!/usr/bin/python3

import asyncio

async def ping(host):
    """
    Prints the hosts that respond to ping request
    """
    ping_process = await asyncio.create_subprocess_shell("ping -c 1 " + host + " > /dev/null 2>&1")
    await ping_process.wait()

    if ping_process.returncode == 0:
        print(host)
    return 


async def ping_all():
    tasks = []

    for i in range(1,255):
        ip = "192.168.1.{}".format(i)
        task = asyncio.ensure_future(ping(ip))
        tasks.append(task)

    await asyncio.gather(*tasks, return_exceptions = True)

asyncio.run(ping_all())

샘플 출력 :

192.168.1.1
192.168.1.3
192.168.1.102
192.168.1.106
192.168.1.6

IP는 응답하자마자 인쇄되기 때문에 IP가 순서대로 정렬되지 않으므로 먼저 응답 한 IP가 먼저 인쇄됩니다.


-3
  1 #!/usr/bin/python
  2
  3 import os
  4 import sys
  5 import time
  6
  7 os.system("clear")
  8 home_network = "172.16.23."
  9 mine = []
 10
 11 for i in range(1, 256):
 12         z =  home_network + str(i)
 13         result = os.system("ping -c 1 "+ str(z))
 14         os.system("clear")
 15         if result == 0:
 16                 mine.append(z)
 17
 18 for j in mine:
 19         print "host ", j ," is up"

icmplib를 사용하면 아래의 루트 권한이 필요합니다. HTH

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.