Facebook Thrift SSH Ошибка размера кадра - PullRequest
0 голосов
/ 14 мая 2018

Я использую сервис Facebook Thrift на своей машине. Я использовал пример кода, чтобы показать его работу:

import asyncio

from fbnet.command_runner.thrift_client import AsyncioThriftClient

# Import FCR Thrift Types
from fbnet.command_runner_asyncio.CommandRunner import ttypes as fcr_ttypes

# Import FCR Service Client
from fbnet.command_runner_asyncio.CommandRunner.Command import Client as FcrClient

import getpass

# Device Information
hostname = 'my_vm'
username = 'root'
password = getpass.getpass('%s Password: ' % username)

# Destination device
device = fcr_ttypes.Device(hostname=hostname, username=username,     password=password)

async def run(cmd, device):
    async with AsyncioThriftClient(FcrClient, 'x.x.x.x',22 ) as client:
        res = await client.run(cmd, device)
        # type of res is `struct CommandResult`
        print(res.output)

loop = asyncio.get_event_loop()
loop.run_until_complete(run('uname -a', device))

Однако я получаю следующую ошибку:

Размер кадра 1397966893 слишком велик для трассировки THeaderProtocol (большинство последний звонок последний):
Файл "pgm1.py", строка 28, в loop.run_until_complete (запустить ('uname -a', устройство))
Файл "/usr/local/lib/python3.6/asyncio/base_events.py", строка 467, в run_until_complete вернуть future.result ()
Файл "pgm1.py", строка 23, запущен res = await client.run (cmd, device) thrift.transport.TTransport.TTransportException: Соединение закрыто

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 14 мая 2018

@ Комментарий Кенстера указывает на реальную проблему здесь.

0x5353482D - это четыре символа "SSH-", которые являются первыми данными, отправляемыми сервером ssh, когда что-то подключается к нему

Есть некоторые реализации сервера, для которых требуется TFramedProtocol по проекту .Другими словами, это обязательно, клиент должен использовать это, просто потому, что сервер ожидает этого таким образом.

Понимание быстро приходит к тому, кто знает, что TFramedProtocol добавляет 4-байтовый заголовок, содержащий кадрразмер данных для подражания.Если клиент не использует TFramedProtocol, сервер будет интерпретировать первые четыре байта данных как размер кадра - отсюда и сообщение об ошибке.

Решение

Добавить TFramedProtocol на стороне клиента дляЭкономичный транспортный / протокольный стек.

...