| | |
| | import asyncio |
| | import asyncssh |
| | import os |
| | import sys |
| | from io import BytesIO |
| |
|
| | |
| | class MySSHServerSession(asyncssh.SSHServerSession): |
| | def connection_made(self, chan): |
| | self.chan = chan |
| |
|
| | def session_started(self): |
| | self.chan.write("Добро пожаловать в SSH-сервис на Hugging Face Spaces!\n") |
| | self.chan.write("Введите команду (для выхода наберите 'exit'):\n") |
| |
|
| | def data_received(self, data, datatype): |
| | |
| | if data.strip() == 'exit': |
| | self.chan.write("До свидания!\n") |
| | self.chan.exit(0) |
| | else: |
| | |
| | self.chan.write("Вы ввели: " + data) |
| |
|
| | def connection_lost(self, exc): |
| | pass |
| |
|
| | |
| | class MySSHServer(asyncssh.SSHServer): |
| | def session_requested(self): |
| | return MySSHServerSession() |
| |
|
| | async def begin_auth(self, username): |
| | |
| | return True |
| |
|
| | |
| | def generate_temp_ssh_key(): |
| | private_key = asyncssh.generate_private_key('ssh-rsa') |
| | private_key_str = private_key.private_key_data.decode('utf-8') |
| | return private_key_str |
| |
|
| | |
| | async def start_ssh_server(): |
| | |
| | port = int(os.environ.get('PORT', 2222)) |
| |
|
| | |
| | private_key_str = generate_temp_ssh_key() |
| |
|
| | try: |
| | |
| | private_key = asyncssh.import_private_key(private_key_str) |
| |
|
| | server = await asyncssh.create_server( |
| | MySSHServer, '', port, |
| | server_host_keys=[private_key] |
| | ) |
| | except (OSError, asyncssh.Error) as exc: |
| | sys.exit('Ошибка при запуске сервера: ' + str(exc)) |
| | |
| | print('SSH-сервер запущен на порту', port) |
| | await server.wait_closed() |
| |
|
| | def main(): |
| | try: |
| | asyncio.run(start_ssh_server()) |
| | except (OSError, asyncssh.Error) as exc: |
| | sys.exit('Ошибка: ' + str(exc)) |
| |
|
| | if __name__ == '__main__': |
| | main() |
| |
|