ssh / app.py
Starchik's picture
Update app.py
6f7d972 verified
#!/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()