TypeError:需要类似字节的对象,而不是';str';在Python3.x中读取和迭代文件时

TypeError:需要类似字节的对象,而不是';str';在Python3.x中读取和迭代文件时,python,python-3.x,Python,Python 3.x,我试图用Python读取和迭代一个文本文件,但我一直遇到这个错误。我对Python非常陌生,我不确定代码中的错误在哪里: import socket def getBanner(ip, port): try: socket.setdefaulttimeout(2) s = socket.socket() s.connect((ip, port)) banner = s.recv(1024) return b

我试图用Python读取和迭代一个文本文件,但我一直遇到这个错误。我对Python非常陌生,我不确定代码中的错误在哪里:

import socket

def getBanner(ip, port):
    try:
        socket.setdefaulttimeout(2)
        s = socket.socket()
        s.connect((ip, port))
        banner = s.recv(1024)
        return banner
    except:
        return

def vulnCheck(banner):
    f = open("vuln_banners.txt", 'r')
    for line in f.readlines():
        if line.strip('\n') in banner:
            print("[+] Server is vulnerable: "+banner.strip('\n'))
        else:
            print("[-] FTP Server is not vulnerable.")
            return


def main():
    portList = [21, 22, 25, 80, 110, 443]
    for x in range(1, 255):
        ip = '192.168.1.' + str(x)
        for port in portList:
            banner = getBanner(ip, port)
            if banner:
                print("[+] " + str(ip) + ": " + str(banner))
                vulnCheck(banner)

if __name__ == '__main__':
    main()
我希望我的程序迭代文本文件中的字符串列表以与横幅进行比较,但是,每次运行代码时都会出现以下错误:

  File "/home/testing/Documents/HelloWorld.py", line 17, in vulnCheck
    if line.strip('\n') in banner:
TypeError: a bytes-like object is required, not 'str'

我读过一些关于这个错误的答案,他们谈到不要以二进制文件的形式打开文件,但我认为我在代码中没有这样做。我只是尝试读取文本文件中的每一行,并对其进行迭代。有人能指出我代码中的错误吗?任何帮助都将不胜感激。

getBanner
中,
banner=s.recv(1024)
bytes
对象,因此
vulnCheck
中的
banner
也是
bytes
。由于您没有以二进制模式打开文件,
line.strip('\n')
将是一个字符串。在
bytes
中搜索
str
字符串是错误的,因为必须对字符串进行编码才能执行此操作(或者必须对字节进行适当解码)


因此,您确实应该以二进制模式打开文件。

banner对象不是字符串,因此python无法搜索byte对象,试图找到字符串。

当文件包含字符串时,套接字返回字节。您需要将一个映射到另一个-可能将
字节
横幅解码为字符串

另一方面,重复读取相同的静态文本文件是这里的一个重要瓶颈。除非文件太大,以至于您无论如何都应该使用数据库,否则请在开始时读取一次

下面还有各种各样的错误修复和风格更新;最重要的是,如果第一次不可匹配性不匹配,请不要在漏洞检查的中间<代码>返回<代码>。还要注意函数通常只返回一个结果,并让调用者自己决定是否打印基于该结果的内容

导入套接字
def get_横幅(ip、端口):
尝试:
socket.setdefaulttimeout(2)
s=socket.socket()
s、 连接((ip,端口))
banner=s.recv(1024)
返回横幅。解码('utf-8')
除:
返回
def vuln_检查(标题、vuln列表):
对于vulnlist中的行:
如果横幅中有行:
返回真值
返回错误
def read_vulns(文件名):
将open(filename,'r')作为f:
返回f.read().splitlines()
def main():
vulns=read_vulns(“vuln_banners.txt”)
端口列表=[21,22,25,80,110,443]
对于范围(1255)内的x:
ip='192.168.1.'+str(x)
对于端口列表中的端口:
banner=get_banner(ip,端口)
如果横幅:
打印(“[+]”,ip+“:”,横幅)
如果vuln_检查(横幅,vuln):
打印(“[+]服务器易受攻击:”,banner.strip('\n'))
其他:
打印(“[-]FTP服务器不易受攻击。”)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

Python 3有点麻烦,因为许多通信和文件缓冲区现在都是字节对象而不是字符串。通常最简单的方法是
decode()
string方法。e、 g.
mystring=mybuffer.decode()
。您也可以使用
encode()。