0

我一直在关注如何制作一个简单的端口扫描器的指南,我正在尝试扫描我自己的 IP,但它卡在一个循环中并且不打印任何端口。很难弄清楚它没有错误并陷入循环。

任何帮助将不胜感激。

import socket
import subprocess
import sys
from datetime import datetime

#clears the shell screen
subprocess.call('clear', shell=True)

#ask for input
remoteServer = raw_input("Please enter a host to scan:")
remoteServerIP = socket.gethostbyname(remoteServer)

#print a banner saying we are scanning
print "-" * 60
print "now scanning your host...", remoteServerIP
print "-" * 60

#Check what time the scan started
t1 = datetime.now()

# Using the range function to specify which ports (1 - 1025)

#Errors.

try:
  for port in range(1, 1025):
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    result = sock.connect_ex((remoteServerIP, port))
    if result == 0:
        #if the socket is listening it will print out the port
      print("Port{}:\t Open".format(port))
    sock.close()

except KeyboardInterrupt:
  print "You pressed ctrl+c"
  sys.exit()

except socket.gaierror:
  print 'Hostname could not be resolved to IP. Exiting'
  sys.exit()

except socket.error:
  print "couldn't connect to server"
  sys.exit()

# checking the time again
t2 = datetime.now()

#calculates the differnce of time, to see how long it took to run the script
total = t2 - t1

#printing the info to screen
print "scanning compelte in :", total
4

2 回答 2

1

您可以使用sock.timeout(0.1)它,因此它不会等待连接。

我把print port看哪个端口被扫描了。

你可以试试8.8.8.8- 没有sock.timeout(0.1)它挂在第一个端口上。

也许你有很好的安全计算机,它阻止了关闭端口的连接。

import sys
from datetime import datetime
import socket

#ask for input
remoteServer = raw_input("Please enter a host to scan: ")
remoteServerIP = socket.gethostbyname(remoteServer)

#print a banner saying we are scanning
print "-" * 60
print "now scanning host ...", remoteServerIP
print "-" * 60

#Check what time the scan started
t1 = datetime.now()

# Using the range function to specify which ports (1 - 1025)

#Errors.

try:
  for port in range(1, 1025):
    print port
    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

    sock.settimeout(0.1)

    result = sock.connect_ex((remoteServerIP, port))
    if result == 0:
        #if the socket is listening it will print out the port
        print("Port {:4d}: Open".format(port))
    sock.close()

except KeyboardInterrupt:
  print "You pressed ctrl+c"
  sys.exit()

except socket.gaierror:
  print 'Hostname could not be resolved to IP. Exiting'
  sys.exit()

except socket.error:
  print "couldn't connect to server"
  sys.exit()

# checking the time again
t2 = datetime.now()

#calculates the differnce of time, to see how long it took to run the script
total = t2 - t1

#printing the info to screen
print "scanning compelte in:", total

顺便提一句:

您可以将结果与nmap等工具的结果进行比较

请参阅scapy - python 模块以使用网络包。(书:黑帽蟒


于 2017-01-11T19:24:24.863 回答
-1

至少在我的机器(Ubuntu 16.something)上它确实有效。输出:

Please enter a host to scan:localhost
------------------------------------------------------------
now scanning your host... 127.0.0.1
------------------------------------------------------------
Port21:  Open
Port22:  Open
Port25:  Open
Port80:  Open
Port139:         Open
Port443:         Open
Port445:         Open
Port631:         Open
scanning compelte in : 0:00:00.047478

但是,它只扫描端口 1-1024,而端口上升到 65535。要使其扫描所有端口,请更改for port in range(1, 1025):for port in range(1, 65536):

于 2017-01-11T19:12:33.587 回答