Python 通过SSH发送序列化Protobuf消息

Python 通过SSH发送序列化Protobuf消息,python,ssh,protocol-buffers,Python,Ssh,Protocol Buffers,所以我试图通过SSH发送序列化的protobuf消息,并在本地机器上反序列化它们。但是,由于某种原因,当我发送序列化字符串时,我收到一个decode错误,表示我正在尝试反序列化被截断的消息 我进行此设置的方式是,我有两个脚本,其中一个通过本地脚本上的Popen和ssh在服务器上运行。服务器上运行的脚本只是将message.SerializeToString()打印到stdout,然后我通过本地脚本上的Popen.stdout收集输出。以下是一些代码片段: 本地计算机脚本: magic_str =

所以我试图通过SSH发送序列化的protobuf消息,并在本地机器上反序列化它们。但是,由于某种原因,当我发送序列化字符串时,我收到一个decode错误,表示我正在尝试反序列化被截断的消息

我进行此设置的方式是,我有两个脚本,其中一个通过本地脚本上的Popen和ssh在服务器上运行。服务器上运行的脚本只是将message.SerializeToString()打印到stdout,然后我通过本地脚本上的Popen.stdout收集输出。以下是一些代码片段:

本地计算机脚本:

magic_str = 'this_is_magical'
ssh = subprocess.Popen('ssh xxx.xxx.xxx.xxx logsearch.py', stdout=subprocess.PIPE)
for line in ssh.stdout:
  #this is just the specific protobuf message structure I created
  l = log_pb2.LogLine()

  #restore the internal newlines, discussed below
  l.ParseFromString(line.replace(magic_str, '\n'))
服务器脚本(logsearch.py):


提前感谢您为我提供的任何帮助,非常感谢。如果需要任何额外信息或有任何不清楚的地方,请让我知道,我会确保澄清。

我不确定我是否完全理解您在这里做的事情,但您确定要为ssh.stdout中的每一行创建新的日志行消息吗?Protobuf反序列化要求整个消息能够正确反序列化。差不多

ssh_data = #... parse all the data received from the pipe (not line for line)
l = log_pb2.LogLine()
l.ParseFromString(ssh_data.replace(magic_str, '\n'))

要做的第一件事是忘记实际尝试反序列化,只需检查:在运行神奇的替换之后,您是否返回了正确的二进制文件。检查它是否与原始文件完全相同(不是文本)


如果您从根本上获取文本,则更明智的做法可能是在传输之前对数据进行base-64编码,然后在另一端对其进行解码。那你就不必担心任何替换了。

这正是我要找的。事实证明,通过SSH发送后,二进制字符串并不完全相同,因此在发送数据之前执行简单的base64编码解决了我的问题。非常感谢。
ssh_data = #... parse all the data received from the pipe (not line for line)
l = log_pb2.LogLine()
l.ParseFromString(ssh_data.replace(magic_str, '\n'))