修复Python TypeError:需bytes-like对象而非str类型错误
报错信息
运行Python socket端口扫描脚本时触发类型错误,完整报错栈如下:
Traceback (most recent call last): File "/home/Documents/venvs/socket_search.py", line 21, in <module> main() File "/home/Documents/venvs/socket_search.py", line 19, in main print("[+]" + ip + "/" + str(port) + " : " + banner.strip('/n')) TypeError: a bytes-like object is required, not 'str'
错误原因
- 核心问题是类型不匹配:
socket.recv()方法读取网络数据返回的是bytes字节类型,而非str字符串类型。对字节类型对象调用strip()方法时,要求传入的参数必须也是字节类型,代码中传入的'/n'是字符串类型,直接触发类型错误。 - 附带笔误:换行转义符为反斜杠开头的
\n,代码中写为正斜杠的/n,即使类型匹配也无法实现去除首尾换行的预期效果。
修复方案
统一在获取banner后将字节数据解码为字符串,同时修正换行符笔误即可。修复后的完整可运行代码如下:
import socket def retBanner(ip,port): try: socket.setdefaulttimeout(2) s = socket.socket() s.connect((ip,port)) banner = s.recv(1024) # 字节转字符串,忽略无法解码的特殊字符避免运行报错 return banner.decode('utf-8', errors='ignore') except: return def main(): ip = input("[*] Enter Target IP: ") for port in range(1,100): banner = retBanner(ip,port) if banner: # 修正换行符笔误 print("[+]" + ip + "/" + str(port) + " : " + banner.strip('\n')) main()
如果不想修改retBanner的返回逻辑,也可以直接在打印语句中处理字节类型,传入字节格式的strip参数,再做解码,仅替换原代码中print行即可:
print("[+]" + ip + "/" + str(port) + " : " + banner.strip(b'\n').decode('utf-8', errors='ignore'))
两种方案都可以解决报错,第一种将解码逻辑封装在banner获取函数中,后续做服务指纹匹配、banner规则过滤时代码更简洁。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

