Подключение к базе данных через двойной туннель SSH с использованием Python Paramiko

Вот моя команда ssh, которая устанавливает туннель с базой данных Postgres, проксируя через хост-бастион:

ssh -i C:/public/keys/my_key.pem -o "ProxyCommand ssh -W %h:%p username1@bastion_host.com" username2@ssh_host_ip -N -L 12345:postgres_host.com:5432 ssh_host_ip

Я хочу преобразовать его в скрипт Python с помощью утилиты sshtunnel. Но трудно понять, что и где нужно передать в утилите, как показано на рисунке:

Я просмотрел несколько сообщений о переполнении стека, но не нашел простого способа сделать это. Разработчики используют переадресацию агента в качестве решения для команды Proxy. Любое прямое преобразование приведенной выше команды в sshtunnel или Paramiko или любой другой питонический способ было бы действительно полезно.


person Kiran Pawar    schedule 20.07.2021    source источник


Ответы (1)


Основываясь на подключении к базе данных PostgreSQL через туннелирование SSH в Python, необходимо сделать следующее:

with SSHTunnelForwarder(
        'bastion_host',
        ssh_username="username1", ssh_password="password1",
        remote_bind_address=('ssh_host_ip', 22)) as bastion:
        
    bastion.start()
    
    with SSHTunnelForwarder(
            ('127.0.0.1', bastion.local_bind_port),
            ssh_username="username2", ssh_pkey="C:/public/keys/my_key.pem",
            remote_bind_address=('postgres_host', 5432)) as ssh:

        ssh.start()

        engine = create_engine(
            'postgresql://<db_username>:<db_password>@127.0.0.1:' +
            str(ssh.local_bind_port) + '/database_name')
person Martin Prikryl    schedule 20.07.2021
comment
сработало как шарм, спасибо, Марин! - person Kiran Pawar; 20.07.2021