You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 19:01:46