File size: 2,722 Bytes
f7ec70d
cc69415
f36614e
f7ec70d
 
181ae35
f7ec70d
 
 
 
 
 
 
 
 
a92df86
f7ec70d
 
 
 
 
 
 
 
a92df86
f7ec70d
 
e7e8666
f7ec70d
 
 
 
 
3bed305
181ae35
3bed305
 
181ae35
 
 
6f7d972
181ae35
 
f7ec70d
f36614e
f7ec70d
 
 
181ae35
 
cc69415
f3cd87b
181ae35
 
 
f7ec70d
 
181ae35
f36614e
f7ec70d
 
 
 
 
e7e8666
f7ec70d
f36614e
f7ec70d
 
 
 
 
 
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python3
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):
        # Если пользователь ввёл 'exit', закрываем сессию
        if data.strip() == 'exit':
            self.chan.write("До свидания!\n")
            self.chan.exit(0)
        else:
            # Эхо-ответ: выводим, что ввёл пользователь
            self.chan.write("Вы ввели: " + data)

    def connection_lost(self, exc):
        pass

# Класс SSH-сервера
class MySSHServer(asyncssh.SSHServer):
    def session_requested(self):
        return MySSHServerSession()

    async def begin_auth(self, username):
        # Простой способ проверки: разрешаем любые логины
        return True

# Генерация временного SSH-ключа в памяти
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 (по умолчанию 2222)
    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()