tutorial invoke_shell example python ssh paramiko

invoke_shell - ¿Cómo crear un túnel ssh usando python y paramiko?



python ssh paramiko tutorial (4)

Estoy aprendiendo Python. Necesito hacer un túnel a los creadores para leer información de una base de datos y cerrar el túnel. Uso paramiko pero no he trabajado con el ejemplo de tonelem. por favor, den un ejemplo de un código simple que crea un túnel.

¡Gracias por adelantado!


Aunque esto no usa paramiko, creo que es una solución muy limpia para implementar (similar a la respuesta de @ dario pero sin administrar el hilo en python).

Hay esta característica poco mencionada en el cliente openssh que nos permite controlar un proceso ssh a través de un socket unix, citando man ssh :

-M Places the ssh client into “master” mode for connection sharing. Multiple -M options places ssh into “master” mode with confirmation required before slave connections are accepted. Refer to the description of ControlMaster in ssh_config(5) for details. -S ctl_path Specifies the location of a control socket for connection sharing, or the string “none” to disable connection sharing. Refer to the description of ControlPath and ControlMaster in ssh_config(5) for details.

Entonces puede iniciar el proceso en segundo plano de ssh (con -Nf ) y luego verificarlo (o terminarlo) con otra llamada ssh .

Utilizo esto en un proyecto que requiere que se establezca un túnel inverso

from subprocess import call, STDOUT import os DEVNULL = open(os.devnull, ''wb'') CONFIG = dict( SSH_SERVER=''ssh.server.com'', SSH_PORT=2222, SSH_USER=''myuser'', SSH_KEY=''/path/to/user.key'', REMOTE_PORT=62222, UNIX_SOCKET=''/tmp/ssh_tunnel.sock'', KNOWN_HOSTS=''/path/to/specific_known_host_to_conflicts'', ) def start(): return call( [ ''ssh'', CONFIG[''SSH_SERVER''], ''-Nfi'', CONFIG[''SSH_KEY''], ''-MS'', CONFIG[''UNIX_SOCKET''], ''-o'', ''UserKnownHostsFile=%s'' % CONFIG[''KNOWN_HOSTS''], ''-o'', ''ExitOnForwardFailure=yes'', ''-p'', str(CONFIG[''SSH_PORT'']), ''-l'', CONFIG[''SSH_USER''], ''-R'', ''%d:localhost:22'' % CONFIG[''REMOTE_PORT''] ], stdout=DEVNULL, stderr=STDOUT ) == 0 def stop(): return __control_ssh(''exit'') == 0 def status(): return __control_ssh(''check'') == 0 def __control_ssh(command): return call( [''ssh'', ''-S'', CONFIG[''UNIX_SOCKET''], ''-O'', command, ''x''], stdout=DEVNULL, stderr=STDOUT )

-o ExitOnForwardFailure=yes asegura que el comando ssh fallará si el túnel no se puede establecer; de lo contrario, no saldrá.


En el trabajo usualmente creamos túneles ssh reenviando puertos. La forma en que lo hacemos es usando el comando estándar ssh -L port:addr:port addr con un subproceso ejecutándose en un hilo separado. Encontré este útil enlace: https://github.com/paramiko/paramiko/blob/master/demos/forward.py con un ejemplo de cómo hacer el reenvío de puertos con paramiko.


Utilicé paramiko para algún proyecto que tuve hace un año, aquí está la parte de mi código donde me conecté con otra computadora / servidor y ejecuté un archivo de python simple:

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname=''...'', username=''...'', password=''...'') stdin, stdout, stderr = ssh.exec_command(''python hello.py'') ssh.close()

stdin , stdout y sdterr contienen las entradas / salidas del comando que ejecutó.

Desde aquí, creo que puedes establecer la conexión con la base de datos.

Aquí hay alguna buena información sobre paramiko .


sshtunnel para mis proyectos. Ejemplo de reenvío del puerto local remoto de MySQL al puerto local del host:

pip install sshtunnel python -m sshtunnel -U root -P password -L :3306 -R 127.0.0.1:3306 -p 2222 localhost