Python 端口扫描程序显示所有关闭的端口

Python 端口扫描程序显示所有关闭的端口,python,python-3.x,Python,Python 3.x,我是Python新手,对我在下面编写的脚本的原因感到困惑 工作不正常,我现在处于一个看不见森林的阶段 树木 我试图从《暴力Python》一书中创建端口扫描程序。我相信 这本书使用Python2.6,但我使用Python3.7创建它 在这个网站的其他帖子中使用提示和技巧,我已经得到了端口扫描仪 在我的实验室设置中扫描一些计算机,但是,扫描总是 显示要“关闭”的端口。我用nmap扫描电脑以确定我有 要在我的端口扫描程序脚本中使用的一些打开的端口 我的剧本在下面 import optparse fro

我是Python新手,对我在下面编写的脚本的原因感到困惑 工作不正常,我现在处于一个看不见森林的阶段 树木

我试图从《暴力Python》一书中创建端口扫描程序。我相信 这本书使用Python2.6,但我使用Python3.7创建它

在这个网站的其他帖子中使用提示和技巧,我已经得到了端口扫描仪 在我的实验室设置中扫描一些计算机,但是,扫描总是 显示要“关闭”的端口。我用nmap扫描电脑以确定我有 要在我的端口扫描程序脚本中使用的一些打开的端口

我的剧本在下面

import optparse
from socket import *
from threading import *
screenLock = Semaphore(value=1)

def connScan(tgtHost, tgtPort):
    try:
        connSkt = socket(AF_INET, SOCK_STREAM)
        connSkt.connect((tgtHost, tgtPort))
        connSkt.send('ViolentPython\r\n')
        results = connSkt.recv(100)
        screenLock.acquire()
        print('[+]%d/tcp open'% tgtPort)
        print('[+]' + str(results))
    except:
        screenLock.acquire()
        print('[-]%d/tcp closed'% tgtPort)
    finally:
        screenLock.release()
        connSkt.close()

def portScan(tgtHost, tgtPorts):
    try:
        tgtIP = gethostbyname(tgtHost)
    except:
        print("[-] Cannot resolve '%s': Unknown host"%tgtHost)
        return
    try:
        tgtName = gethostbyaddr(tgtIP)
        print('\n[+] scan results for: ' + tgtName[0])
    except:
        print('\n[+] Scan results for: ' + tgtIP)
    setdefaulttimeout(1)
    for tgtPort in tgtPorts:
        t = Thread(target=connScan, args=(tgtHost, int(tgtPort)))
        t.start()

def main():
    parser = optparse.OptionParser('usage %prog '+ '-H <target host> -p <target port>')

    parser.add_option('-H', dest='tgtHost', type='string', help='specify target host')
    parser.add_option('-p', dest='tgtPort', type='string', help='specify target port[s] seperated by comma')

    (options, args) = parser.parse_args()

    tgtHost = options.tgtHost
    tgtPorts = [p.strip() for p in options.tgtPort.split(',')]

    if (tgtHost == None) | (tgtPorts[0] is None):
        print(parser.usage)
        exit(0)

    portScan(tgtHost, tgtPorts)

if __name__ == '__main__':
    main()
我敢肯定它不在一百万英里之外,如果有任何帮助,我将不胜感激 任何人都可以尝试解决这个问题

非常感谢

谢谢大家回复我。我又看了一遍我的剧本 对它做了一些更改,我不确定这些是否正确

我将def connScan更改如下,以捕获错误

def connScan(tgtHost, tgtPort):
try:
    connSkt = socket(AF_INET, SOCK_STREAM)
    connSkt.connect((tgtHost, tgtPort))
    connSkt.send (b'ViolentPython\r\n')
    results = connSkt.recv(100)
    screenLock.acquire()
    print('[+]%d/tcp open'% tgtPort)
    print('[+]' + str(results))
except Exception as e:
    screenLock.acquire()
    print('Error: {0}'.format(str(e)))
    print('[-]%d/tcp closed'% tgtPort)
finally:
    screenLock.release()
    connSkt.close()
最初,我收到一个“预期字节类型对象”错误,所以我在 将“Violentpython”的前面转换为字节

现在输出如下所示:

[+] scan results for: Cheryls
[+]139/tcp open
[+]b'\x83\x00\x00\x01\x8f'
Error: [WinError 10054] An existing connection was forcibly closed by the 
remote host
[-]445/tcp closed
Error: timed out
[-]80/tcp closed
Error: timed out
[-]443/tcp closed
Error: timed out
[-]135/tcp closed
Error: timed out
[-]1030/tcp closed

我收到Vovanrock2002建议的超时错误。

最有可能的是,列出的端口上的应用程序一旦意识到“ViolentPython\r\n”不是它们支持的协议的一部分,就会关闭连接。另一方面,
results=connSkt.recv(100)
伴随
setdefaulttimeout(1)
将使recv抛出
socket.timeout
异常

根据python文档
connSkt.connect
也可以抛出超时。所以你基本上需要:

  • 停止通过除之外的裸
    捕获内容。如果您不知道要等待什么异常,请暂时只捕获
    异常
    ,检查捕获的对象,然后用更具体的内容替换它
  • 要将
    connect
    send+recv
    拆分为不同的
    块,请尝试

  • 您是否尝试过在<代码>除
    块中打印错误?此外,端口打开并不意味着它将接受您发送给它的任何数据。许多服务器会在您发送意外数据(如您的情况中的
    ViolentPython\r\n
    )时将您踢出并强制关闭连接,这将导致异常,您会错误地将其检测为关闭端口。切勿在代码中使用裸
    语句,除非使用
    语句。这将隐藏基本错误,如语法错误、拼写错误的变量或试图访问不存在的属性。总是抓住一个例外的具体列表。嗨,Vovanrock2002,谢谢你看我的帖子。您的超时错误是正确的,我在脚本中添加了和exception来捕获它们。拆分连接和发送+接收是解决超时问题的唯一方法,因为我还不知道如何做到这一点。
    
    [+] scan results for: Cheryls
    [+]139/tcp open
    [+]b'\x83\x00\x00\x01\x8f'
    Error: [WinError 10054] An existing connection was forcibly closed by the 
    remote host
    [-]445/tcp closed
    Error: timed out
    [-]80/tcp closed
    Error: timed out
    [-]443/tcp closed
    Error: timed out
    [-]135/tcp closed
    Error: timed out
    [-]1030/tcp closed