diff options
Diffstat (limited to 'examples/asyncio-ssh-python-embed.py')
-rwxr-xr-x | examples/asyncio-ssh-python-embed.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/examples/asyncio-ssh-python-embed.py b/examples/asyncio-ssh-python-embed.py new file mode 100755 index 0000000..86b5607 --- /dev/null +++ b/examples/asyncio-ssh-python-embed.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +""" +Example of running the Python REPL through an SSH connection in an asyncio process. +This requires Python 3, asyncio and asyncssh. + +Run this example and then SSH to localhost, port 8222. +""" +import asyncio +import logging + +import asyncssh + +from ptpython.contrib.asyncssh_repl import ReplSSHServerSession + +logging.basicConfig() +logging.getLogger().setLevel(logging.INFO) + + +class MySSHServer(asyncssh.SSHServer): + """ + Server without authentication, running `ReplSSHServerSession`. + """ + + def __init__(self, get_namespace): + self.get_namespace = get_namespace + + def begin_auth(self, username): + # No authentication. + return False + + def session_requested(self): + return ReplSSHServerSession(self.get_namespace) + + +def main(port=8222): + """ + Example that starts the REPL through an SSH server. + """ + loop = asyncio.get_event_loop() + + # Namespace exposed in the REPL. + environ = {"hello": "world"} + + # Start SSH server. + def create_server(): + return MySSHServer(lambda: environ) + + print("Listening on :%i" % port) + print('To connect, do "ssh localhost -p %i"' % port) + + loop.run_until_complete( + asyncssh.create_server( + create_server, "", port, server_host_keys=["/etc/ssh/ssh_host_dsa_key"] + ) + ) + + # Run eventloop. + loop.run_forever() + + +if __name__ == "__main__": + main() |