AllInfo
Main: Info Blog Temp Mail


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


13.58.212.163 / 2025-04-25_16-52-36 UTC.