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

时间:2013-09-16 19:47:58

标签: python ssh protocol-buffers

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

我有这个设置的方式是我有两个脚本,一个在服务器上通过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​​):

  #get some LogLine object named l, and we replace the internal newlines with
  #magic_str because it messes up reading line by line in the local script
  magic_str = 'this_is_magical'
  print l.SerializeToString().replace('\n', magic_str)

提前感谢您提供给我的任何帮助,非常感谢。如果需要任何额外信息或者有任何不清楚的地方,请告诉我,我一定要澄清。

2 个答案:

答案 0 :(得分:0)

我不确定我完全理解你在这里做了什么,但是你确定要为ssh.stdout中的每个创建一个新的LogLine消息吗? 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'))

答案 1 :(得分:0)

要做的第一件事就是忘记实际尝试反序列化,然后检查一下:在运行魔法替换之后,你是否找回了正确的二进制文件。检查完全与原始文件相同的二进制文件(不是文本)。

如果您从根本上采用文本,那么在传输之前简单地对数据进行base-64编码可能更明智,而base-64在另一侧进行解码。然后你不必担心任何替换。