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