summaryrefslogtreecommitdiffstats
path: root/examples/ssh-and-telnet-embed.py
blob: 62fa76d9f4800efb177eb852d91793cf3f69ac52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python
"""
Serve a ptpython console using both telnet and ssh.

Thanks to Vincent Michel for this!
https://gist.github.com/vxgmichel/7685685b3e5ead04ada4a3ba75a48eef
"""

import asyncio
import pathlib

import asyncssh
from prompt_toolkit import print_formatted_text
from prompt_toolkit.contrib.ssh.server import (
    PromptToolkitSSHServer,
    PromptToolkitSSHSession,
)
from prompt_toolkit.contrib.telnet.server import TelnetServer

from ptpython.repl import embed


def ensure_key(filename: str = "ssh_host_key") -> str:
    path = pathlib.Path(filename)
    if not path.exists():
        rsa_key = asyncssh.generate_private_key("ssh-rsa")
        path.write_bytes(rsa_key.export_private_key())
    return str(path)


async def interact(connection: PromptToolkitSSHSession) -> None:
    global_dict = {**globals(), "print": print_formatted_text}
    await embed(return_asyncio_coroutine=True, globals=global_dict)


async def main(ssh_port: int = 8022, telnet_port: int = 8023) -> None:
    ssh_server = PromptToolkitSSHServer(interact=interact)
    await asyncssh.create_server(
        lambda: ssh_server, "", ssh_port, server_host_keys=[ensure_key()]
    )
    print(f"Running ssh server on port {ssh_port}...")

    telnet_server = TelnetServer(interact=interact, port=telnet_port)
    telnet_server.start()
    print(f"Running telnet server on port {telnet_port}...")

    while True:
        await asyncio.sleep(60)


if __name__ == "__main__":
    asyncio.run(main())