如果我使用 Python boto3 库使用
execute_command
在 AWS ECS 容器上运行命令(如此处所示),并且当我从 websocket 读取时,我的命令只是 echo -ne '\n'
(单个显式换行符)具有我的命令输出的流,输出为 b'\r\n'
。
对于生成文本输出的命令来说这并不是什么大问题,并且可以轻松修复,但如果我运行生成二进制输出的命令,这会损坏我的数据。虽然当我从 websocket 流中读取时,可以通过在客户端上将
\r\n
替换为 \n
来解决此问题,但发生的另一件事是字节 0xfd
、0xfe
和 0xff
根本没有传输。这更难修复,因为无法知道这些字节是从哪里删除的。
我发现的唯一解决方法是将命令运行为
bash -c "echo -en '\n' | base64 -w0"
,并在收到命令后将其解码回二进制。这可行,但会使输出增大约 33%,对于像我正在处理的大型二进制数据,这会增加下载时间几分钟。
是什么导致了这些变化?有办法禁用这个吗?如果没有,是否有比 base64 更有效的解决方法?
你不需要。就做
output.replace(b'\r\n', b'\n')
尝试通过
execute_command
运行以下命令:
printf 'testing\r\ntesting'
您会注意到,在 websocket 流上,您将找到以下字节(由 python3 字节文字表示):
b'testing\r\r\ntesting'
这意味着,他们正在做一个简单的
output.replace(b'\n', b'\r\n')
,这是一个一二一映射。