wrk 2025-01-04 22-39-18
# $ cat sftp.py *** import paramiko import socket import threading class MySSHServer(paramiko.ServerInterface): def check_auth_password(self, username, password): print(f"Authenticating user: {username}") if username == 'user' and password == 'luser': print("Authentication successful") return paramiko.AUTH_SUCCESSFUL print("Authentication failed") return paramiko.AUTH_FAILED def handle_client(channel): print("Client connected") try: sftp_server = paramiko.SFTPServer(channel) sftp_server.root = "/home/sftp/user" # Путь к каталогу пользователя print(f"Serving SFTP requests from {channel.getpeername()} with root {sftp_server.root}") # Обработка запросов SFTP sftp_server.serve_forever() except Exception as e: print(f"Error handling client: {e}") finally: channel.close() print("Client disconnected") def start_sftp_server(): host_key = paramiko.RSAKey.generate(2048) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('0.0.0.0', 22)) # Слушаем на всех интерфейсах на порту 22 server_socket.listen(5) print("SFTP server started on port 22...") while True: client_socket, addr = server_socket.accept() # Принимаем входящее соединение print(f"Connection from {addr}") transport = paramiko.Transport(client_socket) transport.add_server_key(host_key) ssh_server = MySSHServer() try: transport.start_server(server=ssh_server) while True: channel = transport.accept(20) # Ожидаем подключения клиента if channel is None: continue threading.Thread(target=handle_client, args=(channel,)).start() # Обрабатываем подключение клиента в отдельном потоке except Exception as e: print(f"Error: {e}") finally: transport.close() print("Transport closed") if __name__ == "__main__": start_sftp_server() 2025-01-04_22-40-25