2016-10-15 7 views
0

IP 주소를 가져 와서 nmap 검사를 수행하고 출력을 가져 와서 텍스트 파일에 저장하는 프로그램을 만드는 중입니다. 스캔은 정상적으로 작동하지만 텍스트 파일에 아무 것도 쓰지 않는 이유를 알아낼 수 없습니다. 여기 열거 프로그램

내가 당신 show_scan() 함수에서 인쇄 문을 사용하고 지금까지

if __name__ == "__main__": 

    import socket 
    import nmap 
    import sys 
    import io 
    from libnmap.parser import NmapParser, NmapParserException 
    from libnmap.process import NmapProcess 
    from time import sleep 
    from os import path 

    #Program Banner 
    if len(sys.argv) <= 1: 
     print(
""" 
test 
""") 
     sys.exit() 


#Grab IP Address as argument 
if len(sys.argv)==2: 
    ip = sys.argv[1] 
    print "\n[+] Reading IP Address" 


#Function - Pass IP to Nmap then start scanning 
print "\n[+] Passing " + ip + " to Nmap..." 
print("\n[+] Starting Nmap Scan\n") 

def nmap_scan(ip, options): 
    parsed = None 
    nmproc = NmapProcess(ip, options) 
    rc = nmproc.run() 
    if rc != 0: 
     print("nmap scan failed: {0}".format(nmproc.stderr)) 

    try: 
     parsed = NmapParser.parse(nmproc.stdout) 
    except NmapParserException as e: 
     print("Exception raised while parsing scan: {0}".format(e.msg)) 

    return parsed 


#Function - Display Nmap scan results 
def show_scan(nmap_report): 
    for host in nmap_report.hosts: 
     if len(host.hostnames): 
      tmp_host = host.hostnames.pop() 
     else: 
      tmp_host = host.address 

     print("Host is [ %s ]\n" % str.upper(host.status)) 
     print(" PORT  STATE   SERVICE") 

     for serv in host.services: 
      pserv = "{0:>5s}/{1:3s} {2:12s} {3}".format(
        str(serv.port), 
        serv.protocol, 
        serv.state, 
        serv.service) 
      if len(serv.banner): 
       pserv += " ({0})".format(serv.banner) 
      print(pserv) 


#Function - Define output text file name & write to file 
def createFile(dest): 
    name = "Enumerator-Results.txt" 

    if not(path.isfile(dest+name)): 
     f = open(dest+name,"a+") 
     f.write(show_scan(report)) 
     f.close()  



if __name__ == "__main__": 
    report = nmap_scan(ip, "-sV") 
    if report: 
     destination = "/root/Desktop/" 
     createFile(destination) 
     show_scan(report) 
     print "\nReport Complete!" 
    else: 
     print("No results returned") 

답변

0

을 것입니다. 대신 파일 참조를 show_scan()에 전달하고 print() 호출을 f.write() 호출로 대체하십시오. 이렇게하면 현재 인쇄중인 모든 것을 터미널에 저장하는 데 필요한 시간을 절약 할 수 있습니다.

또는 show_scan이 f.write()와 분리되도록 코드를 변경할 수 있습니다.

즉 변화

f.write(show_scan(report)) 

그것은 당신이 원시 출력 또는 당신이 화면에 인쇄하고 저장 여부에 따라 달라집니다

f.write(report) 

합니다. 또한

당신이

createFile(destination, report) 

그냥 당신이 항상 문자열로 f.write()를 호출되어 있는지 확인 즉, 인쇄 할 보고서를 갖도록를 CreateFile에 대한 보고서의 참조를 전달해야합니다 그 매개 변수.

#Function - Define output text file name & write to file 
def createFile(dest, report): 
    name = "Enumerator-Results.txt" 

    if not(path.isfile(dest+name)): 
     f = open(dest+name,"a+") 
     f.write(report) 
     f.close()  



if __name__ == "__main__": 
    report = nmap_scan(ip, "-sV") 
    if report: 
     destination = "/root/Desktop/" 
     createFile(destination, report) 
     show_scan(report) 
     print "\nReport Complete!" 
    else: 
     print("No results returned") 
+0

이 방법을 의미합니까? – Sam

+0

죄송합니다. 업데이트 된 코드 스 니펫을 붙여 넣는 방법을 알아 내려고 노력하고 있습니다. – Sam

+0

업데이트 된 코드 조각 @ sam-findlay를 추가하는 방법 – Sam