Facebook Thrift SSH帧大小错误

时间:2018-05-14 10:07:45

标签: python facebook ssh thrift

我正在我的机器上运行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 Traceback来说太大了(大多数   最近的电话))   文件“pgm1.py”,第28行,in       loop.run_until_complete(run('uname -a',device))
  run_until_complete中的文件“/usr/local/lib/python3.6/asyncio/base_events.py”,第467行       返回future.result()
  运行中的文件“pgm1.py”,第23行       res = await client.run(cmd,device)thrift.transport.TTransport.TTransportException:Connection closed

有关如何纠正此问题的任何想法?

1 个答案:

答案 0 :(得分:0)

@Kenster的评论表明这里存在真正的问题。

  

0x5353482D是四个字符" SSH - ",这恰好是ssh服务器连接到它时发送的第一个数据

some server implementations that require TFramedProtocol by design。换句话说,它是强制性的,客户端必须使用它,只是因为服务器期望它。

对于知道TFramedProtocol添加4字节标头的人来说很快就会有洞察力,该标头包含要遵循的数据的帧大小。如果客户端不使用TFramedProtocol,则服务器会将前四个数据字节解释为帧大小 - 因此会显示错误消息。

解决方案

在客户端将TFramedProtocol添加到Thrift传输/协议栈。