通过stdin/stdout消息进行远程执行。
项目描述
implant
Python中异步ad-hoc远程过程调用的概念证明。
这是一个正在进行中的工作,基本上作为一个练习。
特性
- Python >= 3.5 asyncio 
- ad-hoc可传输远程过程 
- implant.core.Command的远程部分可以位于单独的模块中 
- implant.core.Command特定的implant.core.Channel可以在本地和远程之间启用任意协议 
- 事件 
- 非常小的核心 
- 测试 
限制
- Python >= 3.5 
- 如果没有使用venv,则只支持纯Python模块进行远程导入 
- implant.core.Command必须位于< cite>__main__以外的模块中 
- 目前sudo不能要求输入密码 
示例
通用应用
import asyncio
import pathlib
from implant import core, connect, commands
async def remote_tasks():
    # create a connector for a python process
    connector = connect.Lxd(
        container='zesty',
        hostname='localhost'
    )
    connector_args = {
        'python_bin': pathlib.Path('/usr/bin/python3')
    }
    # connect to a remote python process
    remote = await connector.launch(**connector_args)
    # start remote communication tasks
    com_remote = asyncio.ensure_future(remote.communicate())
    try:
        # execute command
        cmd = commands.SystemLoad()
        result = await remote.execute(cmd)
        print("Remote system load:", result)
    finally:
        # stop communication tasks
        com_remote.cancel()
        await com_remote
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(remote_tasks())
    loop.close()示例Echo命令
import logging
import os
from implant import core
log = logging.getLogger(__name__)
class Echo(core.Command):
    """Demonstrate the basic command API."""
    async def local(self, context):
        """The local side of the RPC.
           :param context: :py:obj:`implant.core.DispatchLocalContext`
        """
        # custom protocol
        # first: send
        await context.channel.send_iteration("send to remote")
        # second: receive
        from_remote = []
        async for x in context.channel:
            from_remote.append(x)
        log.debug("************ receiving from remote: %s", from_remote)
        # third: wait for remote to finish and return result
        remote_result = await context.remote_future
        result = {
            'from_remote': ''.join(from_remote),
        }
        result.update(remote_result)
        return result
    async def remote(self, context):
        """The remote side of the RPC.
           :param context: :py:obj:`implant.core.DispatchRemoteContext`
        """
        # first: receive
        from_local = []
        async for x in context.channel:
            from_local.append(x)
        log.debug("************ receiving from local: %s", from_local)
        # second: send
        await context.channel.send_iteration("send to local")
        # third: return result
        return {
            'from_local': ''.join(from_local),
            'remote_self': self,
            'pid': os.getpid()
        }内部结构
master <-----------------------------------------> remote
                            |
                       stdin/stdout
                            |
                          chunks
                            |
                         channels
                            |
    --> send ---> |                   |  --> queue -->
                  | module:class/fqin |
    <-- queue <-- |                   |  <--- send <--
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
         implant-0.1.2.tar.gz  (34.3 kB 查看哈希值)
      
    构建分发
         implant-0.1.2-py3-none-any.whl  (40.7 kB 查看哈希值)
      
    
    
       关闭
    
      
        
    
    
  
implant-0.1.2.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | ace257625b46a2644d74d97ddfc867561c54f3d041f606ec68ef711af4f69a73 | |
| MD5 | 0eafbd15183cbbedf476280ebffbf7d0 | |
| BLAKE2b-256 | 9c3755a8048e40d4ba6497497f87af847910752a929120ce0c87732305b8a411 | 
    
       关闭
    
      
        
    
    
  
implant-0.1.2-py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | c08d251be9e63e0027bded83607244a6382f34e784ad4276f586e693ef85973c | |
| MD5 | 9ab1e625b2ec595ae81bda97ce6003e7 | |
| BLAKE2b-256 | 60e172c18f680f6aef28ca4c52c43b20105de25d97375936c32e8f200a5b03d5 |