Chrome原生消息传递返回Base64字符串时抛出错误原因排查
我来帮你排查这个问题——你踩了Python里os.system()的一个常见坑!
问题根源:os.system()返回的不是命令输出
你以为os.system("<返回Base64的bash命令>")会把命令的输出赋值给dataurl,但实际上**os.system()返回的是命令的退出状态码**(0表示执行成功,非0值表示执行失败),而不是命令打印到终端的内容。
举个例子:如果你的bash命令执行成功,dataurl会是0,这时候你拼接出来的JSON会是{"text": "0"},完全不是你要的Base64字符串;如果命令执行有问题,dataurl会是一个非0数字,同样不符合Native Messaging要求的JSON格式。Chrome的Native Messaging宿主收到格式错误的消息,直接就断开连接了,这就是你看到报错的原因。
正确的解决方法:用subprocess模块捕获命令输出
要获取bash命令的实际输出,你需要用Python的subprocess模块,它专门用于处理子进程的输入/输出。这里推荐用subprocess.check_output()或者subprocess.run(),前者适合直接捕获成功执行的输出,后者更灵活。
修改你的代码如下:
import subprocess import json # 推荐用json模块生成合法的JSON,避免手动拼接出错 # 替换成你的bash命令 bash_command = "<返回Base64的bash命令>" try: # 执行命令,捕获标准输出,text=True直接返回字符串(不用手动转码) # shell=True允许执行bash命令(如果命令是复杂的管道/脚本,需要这个参数) base64_output = subprocess.check_output(bash_command, shell=True, text=True).strip() # 用json.dumps生成合法的JSON,自动处理特殊字符(虽然Base64不会有,但更稳妥) payload = json.dumps({"text": base64_output}) except subprocess.CalledProcessError as e: # 处理命令执行失败的情况,比如返回错误信息 payload = json.dumps({"text": f"Command failed: {str(e)}"}) # 接下来把payload发送给Chrome(和原代码的发送逻辑一致)
额外注意事项
- 清理输出内容:用
.strip()去掉输出前后的换行符/空格,避免JSON里出现多余的转义字符。 - 安全问题:如果
bash_command包含用户输入,shell=True会有注入风险,这种情况下建议拆分命令为列表形式(比如["echo", "hello"]),不要用shell=True。 - 错误处理:
check_output()会在命令执行失败(退出状态非0)时抛出CalledProcessError,所以加上try-except可以避免脚本崩溃,同时给Chrome返回错误信息。
这样修改后,你就能正确获取到Base64字符串,并生成符合要求的JSON消息发送给Chrome了。
内容的提问来源于stack exchange,提问作者guest271314
相关产品推荐
相关产品推荐

