복붙노트

[PYTHON] 파이썬의 다중 핑 스크립트

PYTHON

파이썬의 다중 핑 스크립트

나는 파이썬과 네트워킹에 관한 문서를 쉽게 배울 수 없다. 이 예에서는 많은 원격 시스템에 대해 ping을 수행 할 수있는 쉬운 스크립트를 작성하려고합니다.

for ping in range(1,10):
   ip="127.0.0."+str(ping)
   os.system("ping -c 3 %s" % ip)

그런 간단한 스크립트는 기계를 핑 (ping) 할 것입니다. 그러나 스크립트가 "active"응답을 반환하도록하고 싶습니다. 그러면 시간 모듈을 찾아야 할 것 같아서 시간을 생각합니다. sleep (5) 그리고 그 이후에는 break 문이 있습니다. 어느 날 내부 루프가 있어야한다고 생각합니다. 나는 100 % 확신 할 수는 없지만 완전히 잘못된 방향으로 갈 수 있습니다. / 누군가 도움이되거나 훌륭한 문서의 방향으로 나를 지적 할 수 있다면.

해결법

  1. ==============================

    1.subprocess.call을 시도하십시오. 사용 된 프로그램의 리턴 값을 저장합니다.

    subprocess.call을 시도하십시오. 사용 된 프로그램의 리턴 값을 저장합니다.

    내 핑 설명서에 따르면 성공시 0을 반환하고 2는 핑을 보냈지 만 답장을받지 못하면 다른 값은 오류를 나타냅니다.

    # typo error in import
    import subprocess
    
    for ping in range(1,10):
        address = "127.0.0." + str(ping)
        res = subprocess.call(['ping', '-c', '3', address])
        if res == 0:
            print "ping to", address, "OK"
        elif res == 2:
            print "no response from", address
        else:
            print "ping to", address, "failed!"
    
  2. ==============================

    2.이 스크립트 :

    이 스크립트 :

    import subprocess
    import os
    with open(os.devnull, "wb") as limbo:
            for n in xrange(1, 10):
                    ip="192.168.0.{0}".format(n)
                    result=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2", ip],
                            stdout=limbo, stderr=limbo).wait()
                    if result:
                            print ip, "inactive"
                    else:
                            print ip, "active"
    

    이 출력과 같은 것을 생성합니다 :

    192.168.0.1 active
    192.168.0.2 active
    192.168.0.3 inactive
    192.168.0.4 inactive
    192.168.0.5 inactive
    192.168.0.6 inactive
    192.168.0.7 active
    192.168.0.8 inactive
    192.168.0.9 inactive
    

    limbo를 subprocess.PIPE로 바꾸고 Popen 객체에서 communicate ()를 사용하면 출력을 캡처 할 수 있습니다.

    p=Popen( ... )
    output=p.communicate()
    result=p.wait()
    

    이렇게하면 명령의 반환 값을 얻고 텍스트를 캡처 할 수 있습니다. 매뉴얼을 따라 유연성을 필요로하는 경우 하위 프로세스를 사용하는 것이 좋습니다.

  3. ==============================

    3.이것에 정말 감사드립니다. Windows에서 작동하도록 수정했습니다. 또한 시간 제한을 너무 낮게 설정 했으므로 반환하지 않는 IP는 각각 5 초 동안 대기하지 않습니다. hochl 소스 코드입니다.

    이것에 정말 감사드립니다. Windows에서 작동하도록 수정했습니다. 또한 시간 제한을 너무 낮게 설정 했으므로 반환하지 않는 IP는 각각 5 초 동안 대기하지 않습니다. hochl 소스 코드입니다.

    import subprocess
    import os
    with open(os.devnull, "wb") as limbo:
            for n in xrange(200, 240):
                    ip="10.2.7.{0}".format(n)
                    result=subprocess.Popen(["ping", "-n", "1", "-w", "200", ip],
                            stdout=limbo, stderr=limbo).wait()
                    if result:
                            print ip, "inactive"
                    else:
                            print ip, "active"
    

    귀하의 구성표에 대한 ip = 및 호스트에 대한 xrange를 변경하십시오.

  4. ==============================

    4.나는 초보자이며 여러 개의 호스트를 핑 (ping)하기위한 스크립트를 작성했습니다. 다중 호스트를 핑 (ping)하려면 ipaddress 모듈을 사용할 수 있습니다.

    나는 초보자이며 여러 개의 호스트를 핑 (ping)하기위한 스크립트를 작성했습니다. 다중 호스트를 핑 (ping)하려면 ipaddress 모듈을 사용할 수 있습니다.

    import ipaddress
    from subprocess import Popen, PIPE
    
    net4 = ipaddress.ip_network('192.168.2.0/24')
    for x in net4.hosts():
        x = str(x)
        hostup = Popen(["ping", "-c1", x], stdout=PIPE)
        output = hostup.communicate()[0]
        val1 = hostup.returncode
     if val1 == 0:
        print(x, "is pinging")
     else:
        print(x, "is not responding")
    
  5. ==============================

    5.한 번에 여러 호스트에 ping을 사용하려면 subprocess.Popen ()을 사용할 수 있습니다.

    한 번에 여러 호스트에 ping을 사용하려면 subprocess.Popen ()을 사용할 수 있습니다.

    #!/usr/bin/env python3
    import os
    import time
    from subprocess import Popen, DEVNULL
    
    p = {} # ip -> process
    for n in range(1, 100): # start ping processes
        ip = "127.0.0.%d" % n
        p[ip] = Popen(['ping', '-n', '-w5', '-c3', ip], stdout=DEVNULL)
        #NOTE: you could set stderr=subprocess.STDOUT to ignore stderr also
    
    while p:
        for ip, proc in p.items():
            if proc.poll() is not None: # ping finished
                del p[ip] # remove from the process list
                if proc.returncode == 0:
                    print('%s active' % ip)
                elif proc.returncode == 1:
                    print('%s no response' % ip)
                else:
                    print('%s error' % ip)
                break
    

    루트로 실행할 수 있다면 순수한 파이썬 핑 스크립트 나 scapy를 사용할 수 있습니다 :

    from scapy.all import sr, ICMP, IP, L3RawSocket, conf
    
    conf.L3socket = L3RawSocket # for loopback interface
    ans, unans = sr(IP(dst="127.0.0.1-99")/ICMP(), verbose=0) # make requests
    ans.summary(lambda (s,r): r.sprintf("%IP.src% is alive"))
    
  6. ==============================

    6.

    import subprocess
    import os
    '''
    servers.txt contains ip address in following format
    192.168.1.1
    192.168.1.2
    '''
        with open('servers.txt', 'r') as f:
            for ip in f:
                result=subprocess.Popen(["ping", "-c", "1", "-n", "-W", "2",    ip],stdout=f, stderr=f).wait()
                if result:
                    print(ip, "inactive")
                else:
                    print(ip, "active")
    
  7. ==============================

    7.파이썬은 실제로 '네트워크의 사용 가능한 호스트를 대상으로 반복자를 반환하는'정말 멋진 방법을 가지고 있습니다. (false로 엄격하게 설정하면 모든 IP에서 반복됩니다)

    파이썬은 실제로 '네트워크의 사용 가능한 호스트를 대상으로 반복자를 반환하는'정말 멋진 방법을 가지고 있습니다. (false로 엄격하게 설정하면 모든 IP에서 반복됩니다)

    예 :

    import subprocess
    import ipaddress
    
    subnet = ipaddress.ip_network('192.168.1.0/24', strict=False)
    for i in subnet.hosts():
        i = str(i)
        subprocess.call(["ping", "-c1", "-n", "-i0.1", "-W1", i])
    

    대기 간격 (-i0.1)은 자동화에 중요 할 수 있습니다. 1 초 시간 제한 (-t1)이 .0 / 24를 초과하여 영원히 걸릴 수도 있습니다

    편집하다: 따라서 ICMP (ping) 요청을 추적하기 위해 다음과 같은 작업을 수행 할 수 있습니다.

    #!/usr/bin/env python
    
    import subprocess
    import ipaddress
    
    alive = []
    subnet = ipaddress.ip_network('192.168.1.0/23', strict=False)
    for i in subnet.hosts():
        i = str(i)
        retval = subprocess.call(["ping", "-c1", "-n", "-i0.1", "-W1", i])
        if retval == 0:
            alive.append(i)
    for ip in alive:
        print(ip + " is alive") 
    

    다음과 같은 결과가 반환됩니다.

    192.168.0.1 is alive
    192.168.0.2 is alive
    192.168.1.1 is alive
    192.168.1.246 is alive
    

    ICMP에 응답하는 모든 IP는 전체 / 23에 이릅니다.

  8. ==============================

    8.

    import subprocess,os,threading,time
    from queue import Queue
    lock=threading.Lock()
    _start=time.time()
    def check(n):
        with open(os.devnull, "wb") as limbo:
                    ip="192.168.21.{0}".format(n)
                    result=subprocess.Popen(["ping", "-n", "1", "-w", "300", ip],stdout=limbo, stderr=limbo).wait()
                    with lock:                    
                        if not result:
                            print (ip, "active")                    
                        else:
                            pass                        
    
    def threader():
        while True:
            worker=q.get()
            check(worker)
            q.task_done()
    q=Queue()
    
    for x in range(255):
        t=threading.Thread(target=threader)
        t.daemon=True
        t.start()
    for worker in range(1,255):
        q.put(worker)
    q.join()
    print("Process completed in: ",time.time()-_start)
    

    나는 이것이 더 나은 것이라고 생각한다.

  9. from https://stackoverflow.com/questions/12101239/multiple-ping-script-in-python by cc-by-sa and MIT license