2017-10-10 17 views
1

에 I/O 작업, 저 좀 도와주세요 내가 성공하지 않고 3 일 전부터이 문제를 해결하고 파이썬의 새로운 메신저 코드에서 제발 변경하고 설명하려고하시기 바랍니다 그것을 scapy를 통해 arp 스캐너로 만들고 scapy 스캔 결과를 가져 와서 리눅스 머신의 txt 파일에 스캔 결과 (ip와 macaddress)를 저장합니다에 ValueError :</p> <p>이가있다 : 폐쇄 파일 오류

외부 파이썬 스크립트 (doublepulsar-detection-script )를 실행하십시오) 다음 명령을 통해 : os.system ("python detect_doublepulsar_smb.py - file last.txt")

last.txt는 = 파일이 포함 scapy 검사 결과의

하지만 검사 내가이 오류가있어 할 때 :

logging.basicConfig(format='%(asctime)s %(levelname)-5s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG) 
logger = logging.getLogger(__name__) 


def long2net(arg): 
if (arg <= 0 or arg >= 0xFFFFFFFF): 
    raise ValueError("illegal netmask value", hex(arg)) 
return 32 - int(round(math.log(0xFFFFFFFF - arg, 2))) 


def to_CIDR_notation(bytes_network, bytes_netmask): 
network = scapy.utils.ltoa(bytes_network) 
netmask = long2net(bytes_netmask) 
net = "%s/%s" % (network, netmask) 
if netmask < 16: 
    logger.warn("%s is too big. skipping" % net) 
    return None 

return net 


def scan_and_print_neighbors(net, interface, timeout=1): 
logger.info("arping %s on %s" % (net, interface)) 
try: 
    ans, unans = scapy.layers.l2.arping(net, iface=interface, timeout=timeout, verbose=True) 
    for s, r in ans.res: 
     line = r.sprintf("%Ether.src% %ARP.psrc%") 
     try: 
      hostname = socket.gethostbyaddr(r.psrc) 
      line += " " + hostname[0] 
     except socket.herror: 
      # failed to resolve 
      pass 
     logger.info(line) 
except socket.error as e: 
    if e.errno == errno.EPERM:  # Operation not permitted 
     logger.error("%s. Did you run as root?", e.strerror) 
    else: 
     raise 

while True: 

lena = int(raw_input("Enter Number : ")) 
print(lena) 


if __name__ == "__main__": 
    import sys 
    import os 
    import time 


    sys.stdout = open('textout.txt', 'w+') 

    if lena == 1: 
     for network, netmask, _, interface, address in scapy.config.conf.route.routes: 
      # skip loopback network and default gw 
      if network == 0 or interface == 'lo' or address == '127.0.0.1' or address == '0.0.0.0': 
       continue 

      if netmask <= 0 or netmask == 0xFFFFFFFF: 
       continue 

     net = to_CIDR_notation(network, netmask) 
     if interface != scapy.config.conf.iface: 
      # see http://trac.secdev.org/scapy/ticket/537 
      logger.warn("skipping %s because scapy currently doesn't support arping on non-primary network interfaces", net) 

     if net: 
      scan_and_print_neighbors(net, interface) 

      sys.stdout.close() 

      os.system("awk 'NR > 2 {print $2}' textout.txt > last.txt") 

      os.system("python detect_doublepulsar_smb.py --file last.txt") 


    elif lena == 3 : 
     print("bye Bye") 
     break 
+0

들여 쓰기를 수정하십시오. – Steampunkery

+1

올바른 들여 쓰기로 전체 코드를 보지 않고 말하기는 힘들지 만'sys.stdout.close()'행과 관련이있을 것입니다. stdout을 닫으면 나중에 어떻게 인쇄 할 수 있습니까? – Kevin

+0

와우,이 코드는 단지 예외보다 훨씬 더 잘못되었습니다. 당신은 메인 루틴 전체를 if __name__ == "__main __":'안에 넣어야합니다. 원래 코드 작성자에게 물어볼 수 있습니까? –

답변

0

문제는 코드에 있습니다

Traceback (most recent call last): File "test.py", line 116, in lena = int(raw_input("Enter Number : ")) ValueError: I/O operation on closed file

이 전체 코드입니다 여기서 표준 출력 파일 핸들러를 닫지 만 나중에 input"Enter Number : "을 쓰려고합니다.

if net: 
     scan_and_print_neighbors(net, interface) 

     sys.stdout.close() # <<< 

빠른 수정을 위해, 다음, 다른 변수에 표준 stdout을 저장하는 가까운 이후로 리디렉션.

if __name__ == "__main__": 
    import sys 
    import os 
    import time 

    saved_stdout = sys.stdout 
    sys.stdout = open('textout.txt', 'w+') 

    ... 

    sys.stdout.close() 
    sys.stdout = saved_stdout 
+1

당신은 2 일 동안 아무도 나를 위해이 문제를 해결할 수있는 큰 보스 해결되지 <3 매우 감사합니다 – evilcode1