blob: 378784cecdb9de6deeb7612d1615b272603713a3 (
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
|
#!/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
from prompt_toolkit.contrib.telnet.server import TelnetServer
from ptpython.repl import embed
def ensure_key(filename="ssh_host_key"):
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=None):
global_dict = {**globals(), "print": print_formatted_text}
await embed(return_asyncio_coroutine=True, globals=global_dict)
async def main(ssh_port=8022, telnet_port=8023):
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())
|