简单的python端口扫描仪(带问题)

时间:2015-06-23 14:33:00

标签: python

我是python编程的新手,这里有一个我已经完成的fisrt代码

所以,这是我已经完成的端口扫描程序,它在localhost上工作正常, 但是当我尝试扫描一个网站时,等了10分钟后什么都没有 我的代码出了什么问题。

这是代码:

from socket import *

print "Simple port scanner"
print "-------------------"
print ""
adress = raw_input("Enter adress (or localhost): ")
ip = gethostbyname(adress)
print adress,"has the IP:",ip
alpha = int(raw_input("Port (min):"))
omega = int(raw_input("Port (max):"))


def scanner(ip,min_port, max_port):
    count = 0
    for ports in range(alpha, omega):
        s = socket(AF_INET, SOCK_STREAM)
        result = s.connect_ex((ip, ports))
        if(result == 0) :
            print 'Port %d: is OPEN' % (ports,)
            count = count + 1
        s.close()
    print "Scanning finshed !"
    print ""
    print "Found",count,"open ports"           




print ""
print "Beggin to scan..."
scanner(ip,alpha,omega)

以下是localhost的输出:

    Simple port scanner
-------------------

Enter adress (or localhost): localhost
localhost has the IP: 127.0.0.1
Port (min):0
Port (max):100

Beggin to scan...
Port XX: is OPEN
Port XX: is OPEN
Scanning finshed !

Found 2 open ports

和谷歌的输出(例如) 并且有问题,没有:(

 Simple port scanner
-------------------

Enter adress (or localhost): google.com
google.com has the IP: 74.125.195.100
Port (min):24
Port (max):82

Beggin to scan...

感谢您帮助我。

4 个答案:

答案 0 :(得分:0)

如果您将s.connect_ex()更改为s.connect(),则会在发生错误时引发Execption。 connect_ex返回需要解释的错误值。存在许多错误,例如超时或连接被拒绝。

如果我在服务器上测试它,很多端口都会被主动拒绝。所以,如果我打印

    print "Port %d is closed" % ports   

我可以看到所有端口都被拒绝了。

最好的方法是查看使用connect()获得的错误消息,并了解如何处理这些错误消息,特别是因为您不熟悉python。

此外,您可以设置套接字在尝试连接时放弃的超时时间。

    s.settimeout(3)

答案 1 :(得分:0)

谢谢你的回答劳伦斯本森, 我已尝试使用其他IP(不再谷歌,但我的网站和朋友网站保持合法)但同样的错误,你有想法改进这个脚本?

答案 2 :(得分:0)

谢谢你, 我做了一些改变,现在它可以工作:)我已经改变了#34; .connect_ex" to" .connect",添加try / except和两个setoutouts。

这是代码(修改):

from socket import *

print "Simple port scanner"
print "-------------------"
print ""
adress = raw_input("Enter adress (or localhost): ")
ip = gethostbyname(adress)
print adress,"has the IP:",ip
alpha = int(raw_input("Port (min):"))
omega = int(raw_input("Port (max):"))


def scanner(ip,alpha, omega):
    count = 0    
    for ports in range(alpha, omega):
        try:
            print "Scanning port :%d" % (ports,)
            s = socket(AF_INET, SOCK_STREAM)
            s.settimeout(3)
            s.connect((ip, ports))
            s.settimeout(3)
            print "Port %d: is OPEN" % (ports,)
            count = count + 1
        except:
            print "Port %d is CLOSED" % (ports,)
        s.close()
    print "Scanning finshed !"
    print ""
    print "Found %d open ports" % (count)          




print ""
print "Beggin to scan..."
scanner(ip,alpha,omega)

输出:

Enter adress (or localhost): xxx.xxx.org
xxx.xxx.org has the IP: xx.xx.xx.xx
Port (min):440
Port (max):445

Beggin to scan...
Scanning port :440
Port 440 is CLOSED
Scanning port :441
Port 441 is CLOSED
Scanning port :442
Port 442 is CLOSED
Scanning port :443
Port 443: is OPEN
Scanning port :444
Port 444 is CLOSED
Scanning finshed !

Found 1 open ports

答案 3 :(得分:0)

我建议有一个检查端口状态的函数。

#-*-coding:utf8;-*-
#qpy:3
#qpy:console

import socket
import os

# This is used to set a default timeout on socket
# objects.
DEFAULT_TIMEOUT = 0.5

# This is used for checking if a call to socket.connect_ex
# was successful.
SUCCESS = 0

def check_port(*host_port, timeout=DEFAULT_TIMEOUT):
    ''' Try to connect to a specified host on a specified port.
    If the connection takes longer then the TIMEOUT we set we assume
    the host is down. If the connection is a success we can safely assume
    the host is up and listing on port x. If the connection fails for any
    other reason we assume the host is down and the port is closed.'''

    # Create and configure the socket.
    sock = socket.socket()
    sock.settimeout(timeout)

    # the SO_REUSEADDR flag tells the kernel to reuse a local 
    # socket in TIME_WAIT state, without waiting for its natural
    # timeout to expire.
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Like connect(address), but return an error indicator instead
    # of raising an exception for errors returned by the C-level connect() 
    # call (other problems, such as “host not found,” can still raise exceptions). 
    # The error indicator is 0 if the operation succeeded, otherwise the value of 
    # the errnovariable. This is useful to support, for example, asynchronous connects.
    connected = sock.connect_ex(host_port) is SUCCESS

    # Mark the socket closed. 
    # The underlying system resource (e.g. a file descriptor)
    # is also closed when all file objects from makefile() are closed.
    # Once that happens, all future operations on the socket object will fail. 
    # The remote end will receive no more data (after queued data is flushed).
    sock.close()

    # return True if port is open or False if port is closed.
    return connected


con = check_port('www.google.com', 83)
print(con)