2014-03-19 3 views
0

시간을내어 주셔서 감사합니다!파이썬 : 스레드 ARP 핑을위한 이상한 결과

내가 겪고있는 문제는 내 스레드 ARP 스크립트의 출력과 관련이 있습니다. 내가 뭘 하려는지 명령 프롬프트에 각 살아있는 호스트 출력의 IP 주소, MAC 주소 및 NIC 공급 업체를 가지고있다.

스레딩이없는 오래된 ARP 스크립트가 있습니다.이 스크립트는 약 90 초가 걸리고 이상적인 출력을 인쇄합니다.

위의 스크립트를 기반으로하는 최신 스크립트 인 스레딩이 있습니다. 불행히도 출력에 값이 표시되지 않는 이유는 알 수 없습니다. 아무도 도와 줄 수 없다면 나는 매우 감사 할 것입니다!

미리 감사드립니다.

Mac Address IP address  NIC Vendor 

[][] 

[] 

[] 

[] 
[] 
[][] 
[] 

[] 

등이 같은 약 200 라인 :

def arp2(ip): 

    # An ARP scanner for the network. 
    ips = [] 

    global ans, unans 
    ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=2, verbose=0) 

    for snd, rcv in ans: 
    #Assign MAC address and IP address to variables mac and ipaddr 

     mac = rcv.sprintf(r"%Ether.src%") 
     ipaddr = rcv.sprintf(r"%ARP.psrc%") 

     #Get NIC vendor code from MAC address 
     niccode = mac[:8] 
     niccode = niccode.upper() 

     print ips 
     ips.append("end") 

     #ARPips file amendments 
     with open('C:\Python26\ARPips.prn', 'w+') as f: 
      f.write("\n".join(map(lambda x: str(x), ips)) + "\n") 

     #String lookup for NIC vendors. DO NOT CHANGE 'r' TO ANY OTHER VALUE. 
     with open('C:\Users\TomVB\Desktop\OID2.prn', 'r') as file: 
      for line in file: 
       if niccode in file: 
        return mac, ipaddr, line[8:] 




def main(): 

    print "Discovering..." 
    print "" 
    print "MAC Address \t \t IP Address \t NIC Vendor" 


    pool = Pool(processes=12) 

    Subnetlist = [] 

    for i in range(255): 
     Subnetlist.append(str(IPInt+str(i))) 

    global ARPresults 
    ARPresults = pool.map(arp2, Subnetlist) 

    pool.close() 
    pool.join() 


    print "\n".join(ARPresults) 

if __name__ == '__main__': 
    main() 

이 스크립트는 나에게 다음과 같은 출력을 제공합니다.

+0

[이전 질문에 대한 내 대답을 다시 읽어 같다. 문제는 비슷합니다] (http://stackoverflow.com/q/22330003/4279) – jfs

+0

헤이 @ J.F.Sebastian, 이걸 보아 주셔서 감사합니다.이 스크립트를 작성할 때 이것을 생각했습니다. Mac 및 ipaddr가 반환되고지도에서 가져온 경우에도 인쇄되지 않는 이유를 알고 있습니까? 나는 정말 명백한 것을 놓치고있는 것처럼 느낍니다.) : –

+0

이전 질문의 첫 번째 문제 :'ping()'은 아무 것도 반환하지 않지만 결과를 출력하려고합니다. 'arp2()'는 아무것도 반환합니까? – jfs

답변

0

먼저, 다중 처리를 사용하고 스레드를 사용하지 않는 것 같습니다. 그 두 가지는 꽤 다르게 행동하며, 나는 당신이 그것에 대해 조사 할 것을 제안합니다. 어쨌든, 당면한 문제에 대해서는 그 원인이 다른 곳에 있습니다.

arp2 메서드는 병렬로 실행됩니다. 그 방법에 두 가지 문제점이 있습니다.

print "%s \t %s \t %s" % (mac, ipaddr, line[8:]) 

이 문은 표준 출력으로 인쇄됩니다. 우리 코드에서는 최대 12 개의 프로세스가 동시에 실행될 수 있습니다. 파이썬은 당신에게 print 문장이 원자 적이라는 보장을하지 않습니다. 한 프로세스가 다음 프로세스가 자신의 행을 쓸 때 행의 절반을 기록한 것은 매우 잘 일어날 수 있습니다. 간단히 말해 출력 결과가 엉망입니다.

with open('C:\Python26\ARPips.prn', 'w+') as f: 
    f.write("\n".join(map(lambda x: str(x), ips)) + "\n") 

가 다시 프로세스가 서로의 발가락을 밟지 않는다는 보장이 없기 위해

동일하게 보유하고 있습니다. 파일 내용이 검색 될 수 있습니다.

가장 쉬운 해결책은 arp2 방법으로 파일이나 콘솔 출력을 수행하지 않는 것입니다. 대신 결과를 반환하십시오. pool.map은 귀하를 대신하여 그러한 결과를 안전하게 수집합니다. 정상적인 map 기능처럼 동작합니다. 그런 다음 파일과 콘솔로 출력 할 수 있습니다.

스캔하면 multiprocessing.Lock으로 예를 들어, 프로세스 (동기화 할 수있는 하나의 프로세스 만이 지금까지 같은 시간에/인쇄를 작성되도록 실행되는 동안 출력을 원하는 경우 또한

:..

  • 는 Windows 스타일의 경로와 문자열 리터럴의 전면에 'R'을 넣어 :. x = r'C:\Users\TomVB\Desktop\OID2.prn' 슬래시 파이썬에서 탈출에 사용되는

  • 로드 C:\Users\TomVB\Desktop\OID2.prn의 내용을 012로.. 훨씬 더 빠를 것입니다.

  • map(lambda x: str(x), ips)map(str, ips)

+0

안녕하세요 @ 스탄 매우 답장을 보내 주셔서 감사합니다! 이 일을 저와 함께 보면서 정말로 고마워요. , 반환 맥 : 인쇄 "%의 \ t %의 \ t %의"% (맥, IPADDR, 라인 [8 :])이에 당신의 대답에 관해서 , 나는이 문장을 변경 출력은 통상적으로 예를 들어 다음과 같이 될 수있다 : [5] [3] [1] [2] [4] [1] [5] [2] [4] [] [] [] [] [] [] [] 등 [5] 출력은 여전히 ​​비슷 왜 이것이 발생했는지 알 수 있습니까? –

+0

사용중인 실제 코드를 보여주십시오. 당신이 설명하는 것이 당신의 코드와 일치하지 않습니다. 유일한 변경이 튜플을 리턴하는 것이라면, 'ARPresults'는 튜플의리스트가 될 것입니다. 'print "\ n".join (ARPresults)'는 에러를 발생시킵니다. 또한 pls는'hostID + = 1'과 같이 사용되지 않는 코드를 정리합니다. – Stefan

+0

안녕하세요 @ 스 테판, 나는 성명을 변경했습니다 : "\ n".join (ARPresults) 인쇄 오류가 표시되지 않지만 왜 값이 표시되지 않는 이유는 무엇입니까? 다시 조언 주셔서 감사합니다 :) –