Skip to main content

Remote execution via stdin/stdout messaging.

Project description

https://travis-ci.org/diefans/implant.svg?branch=master

A proof-of-concept for asynchronous adhoc remote procedure calls in Python.

This is work in progress and serves basically as an exercise.

Features

  • Python >= 3.5 asyncio

  • adhoc transferable remote procedures

  • remote part of a implant.core.Command may reside in a separate module

  • a implant.core.Command specific implant.core.Channel enables arbitrary protocols between local and remote side

  • events

  • quite small core

  • tests

Limitations

  • Python >= 3.5

  • only pure Python modules are supported for remote import, if no venv is used

  • implant.core.Command s must reside in a module other then __main__

  • at the moment sudo must not ask for password

Example

General application

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

An example Echo Command

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()
        }

Internals

master <-----------------------------------------> remote
                            |
                       stdin/stdout
                            |
                          chunks
                            |
                         channels
                            |
    --> send ---> |                   |  --> queue -->
                  | module:class/fqin |
    <-- queue <-- |                   |  <--- send <--

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

implant-0.1.1.tar.gz (38.2 kB view details)

Uploaded Source

Built Distribution

implant-0.1.1-py3-none-any.whl (146.6 kB view details)

Uploaded Python 3

File details

Details for the file implant-0.1.1.tar.gz.

File metadata

  • Download URL: implant-0.1.1.tar.gz
  • Upload date:
  • Size: 38.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for implant-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6994ec2c8d543e1888571104348b6dc2773b10d2246cc2df2b18683c33f7f254
MD5 b1cef84453ee13a3e152c70b73b40ec3
BLAKE2b-256 6e2d39acdb9463d50f4760222e5c66ffdbcbae0ecbba96d931b825565a51ccd3

See more details on using hashes here.

File details

Details for the file implant-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for implant-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fd1068c72073905437bbc47a8546573bac9689f5897d423fc252848d2485f376
MD5 6d6969e7a5f00105fc6305b6e80f081c
BLAKE2b-256 ca67d37d83bd58b5436bc4a77131be1704d74759e5bf2bd7268b2691e7474007

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page