TypeError:需要类似字节的对象,而不是';str';在Python3.x中读取和迭代文件时
我试图用Python读取和迭代一个文本文件,但我一直遇到这个错误。我对Python非常陌生,我不确定代码中的错误在哪里: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
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()。