2013-09-16 2 views
0

, поэтому я пытаюсь отправить более сериализованные сообщения protobuf через SSH и десериализовать их на моем локальном компьютере. Тем не менее, по какой-то причине, когда я отправляю через сериализованную строку, я получаю сообщение DecodeError о том, что я пытаюсь десериализовать Truncated Message.Отправка сериализованного сообщения Protobuf по SSH

У меня есть эта настройка, у меня есть два сценария, один из которых выполняется на сервере через Popen и ssh по моему локальному скрипту. Скрипт, запущенный на сервере, просто печатает сообщение .SerializeToString() в stdout, а затем я собираю этот вывод через Popen.stdout в своем локальном скрипте. Вот некоторые фрагменты кода:

Local Machine Script:

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')) 

Сервер Script (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) 

Спасибо заранее за любую помощь вы можете предоставить мне, что очень ценится. Если какая-либо дополнительная информация необходима или если что-то неясно, сообщите мне, и я обязательно уточню.

ответ

0

Первое, что нужно сделать, это забыть о самом деле пытается десериализации, и просто проверить: вы получите назад правый двоичный, после запуска ваши магические замены. Проверьте, что это точно тот же двоичный (а не текст) в качестве оригинала.

Если вы в основном принимаете текст, может быть разумнее просто кодировать данные до передачи до 64, а base-64 декодировать его с другой стороны. Тогда вам не придется беспокоиться о каких-либо заменах.

+0

Это именно то, что я искал. Оказывается, двоичная строка не совсем то же самое после отправки ее через SSH, поэтому простейшая кодировка base64 перед отправкой данных по разрешению моих проблем. Спасибо! – xlnc

0

Я не уверен, что понимаю, что вы здесь делаете, но вы уверены, что хотите создать новое сообщение LogLine для каждой строки в 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')) 
Смежные вопросы