Starchik commited on
Commit
f7ec70d
·
verified ·
1 Parent(s): f36614e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -47
app.py CHANGED
@@ -1,58 +1,68 @@
1
- import os
2
  import asyncio
3
  import asyncssh
4
- from flask import Flask
 
 
 
 
 
 
 
 
 
 
5
 
6
- app = Flask(__name__)
 
 
 
 
 
 
 
7
 
8
- SSH_PORT = 2222 # Локальный порт для SSH
9
- SSH_USER = "user"
10
- SSH_PASSWORD = "password"
11
 
 
 
 
 
 
 
12
  async def start_ssh_server():
13
- """Запускаем SSH-сервер на Python (без root-прав)"""
14
- async def handle_client(process):
15
- process.stdout.write("Welcome to Python SSH Server!\n")
16
- while not process.stdin.at_eof():
17
- line = await process.stdin.readexactly(1)
18
- process.stdout.write(line)
 
 
 
 
 
19
 
20
  try:
21
- await asyncssh.listen(
22
- "", SSH_PORT,
23
- server_host_keys=["ssh_host_key"],
24
- process_factory=handle_client,
25
- authorized_client_keys=None,
26
- password_auth=True,
27
- username_passwords={SSH_USER: SSH_PASSWORD}
28
  )
29
- print(f"SSH server running on port {SSH_PORT}")
30
- except Exception as e:
31
- print(f"Error starting SSH server: {e}")
 
 
32
 
33
- @app.route('/')
34
- def home():
35
- """Пробрасываем SSH через Ngrok"""
36
  try:
37
- import pyngrok
38
- ssh_tunnel = pyngrok.ngrok.connect(SSH_PORT, "tcp")
39
- print(f"SSH tunnel established: {ssh_tunnel.public_url}")
40
- return f"SSH доступ: {ssh_tunnel.public_url.replace('tcp://', '')}"
41
- except Exception as e:
42
- print(f"Error starting Ngrok: {e}")
43
- return "Error starting Ngrok tunnel."
44
-
45
- if __name__ == "__main__":
46
- # Генерируем SSH-ключи (если их нет)
47
- if not os.path.exists("ssh_host_key"):
48
- os.system("ssh-keygen -b 2048 -t rsa -f ssh_host_key -N ''")
49
-
50
- # Запускаем SSH сервер асинхронно
51
- loop = asyncio.get_event_loop()
52
- loop.create_task(start_ssh_server())
53
-
54
- # Запускаем Flask
55
- try:
56
- app.run(host="0.0.0.0", port=7860)
57
- except Exception as e:
58
- print(f"Error starting Flask app: {e}")
 
1
+ #!/usr/bin/env python3
2
  import asyncio
3
  import asyncssh
4
+ import os
5
+ import sys
6
+
7
+ # Класс сессии: обрабатывает подключение и ввод данных
8
+ class MySSHServerSession(asyncssh.SSHServerSession):
9
+ def connection_made(self, chan):
10
+ self.chan = chan
11
+
12
+ def session_started(self):
13
+ self.chan.write("Добро пожаловать в SSH-сервис на Hugging Face Spaces!\n")
14
+ self.chan.write("Введите команду (для выхода наберите 'exit'):\n")
15
 
16
+ def data_received(self, data, datatype):
17
+ # Если пользователь ввёл 'exit', закрываем сессию
18
+ if data.strip() == 'exit':
19
+ self.chan.write("До свидания!\n")
20
+ self.chan.exit(0)
21
+ else:
22
+ # Эхо-ответ: выводим, что ввёл пользователь
23
+ self.chan.write("Вы ввели: " + data)
24
 
25
+ def connection_lost(self, exc):
26
+ pass
 
27
 
28
+ # Класс SSH-сервера
29
+ class MySSHServer(asyncssh.SSHServer):
30
+ def session_requested(self):
31
+ return MySSHServerSession()
32
+
33
+ # Функция для запуска сервера
34
  async def start_ssh_server():
35
+ # Читаем порт из переменной окружения PORT (по умолчанию 2222)
36
+ port = int(os.environ.get('PORT', 2222))
37
+
38
+ # Если задан путь к файлу ключа (переменная HOST_KEY_FILE) и он существует, используем его.
39
+ # Иначе генерируем временный ключ.
40
+ host_key_file = os.environ.get('HOST_KEY_FILE')
41
+ if host_key_file and os.path.exists(host_key_file):
42
+ host_keys = [host_key_file]
43
+ else:
44
+ print("Генерация временного ключа сервера...", file=sys.stderr)
45
+ host_keys = [asyncssh.generate_private_key('ssh-rsa')]
46
 
47
  try:
48
+ server = await asyncssh.create_server(
49
+ MySSHServer, '', port,
50
+ server_host_keys=host_keys,
51
+ # Для демонстрации принимаем любые учетные данные.
52
+ password_authenticator=lambda username, password: True,
53
+ allow_pty=True
 
54
  )
55
+ except (OSError, asyncssh.Error) as exc:
56
+ sys.exit('Ошибка при запуске сервера: ' + str(exc))
57
+
58
+ print('SSH-сервер запущен на порту', port)
59
+ await server.wait_closed()
60
 
61
+ def main():
 
 
62
  try:
63
+ asyncio.run(start_ssh_server())
64
+ except (OSError, asyncssh.Error) as exc:
65
+ sys.exit('Ошибка: ' + str(exc))
66
+
67
+ if __name__ == '__main__':
68
+ main()