Comment créer un tunnel ssh en utilisant python et paramiko?

j'apprends le python. J'ai besoin de créateurs de tunnel pour lire les informations d'une base de données et fermer le tunnel. J'utilise paramiko mais je n'ai pas travaillé avec tonelem exemple. veuillez donner un exemple de code simple créant un tunnel.

Merci d'avance!

25
demandé sur Ivan 2011-11-17 19:27:58

4 réponses

au travail, nous créons habituellement des ports de transit de tunnels ssh. La façon dont nous faisons cela est, en utilisant la commande standard ssh -L port:addr:port addr avec un sous-processus tournant dans un thread séparé. J'ai trouvé ce lien utile:https://github.com/paramiko/paramiko/blob/master/demos/forward.py avec un exemple de transfert de port avec paramiko.

9
répondu dario 2018-03-11 08:25:21

j'ai utilisé sshtunnel pour mes projets. Exemple de transfert du port MySQL local distant vers le port local hôte:

pip install sshtunnel
python -m sshtunnel -U root -P password -L :3306 -R 127.0.0.1:3306 -p 2222 localhost
7
répondu pahaz 2015-06-17 20:23:09

même si cela n'utilise pas paramiko, je crois que c'est une solution très propre à mettre en œuvre (similaire à la réponse de@dario mais sans gérer le thread en python).

il y a cette petite fonctionnalité dans le client openssh qui nous permet de contrôler un processus ssh à travers une socket unix, en citant 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.

vous pouvez donc lancer le processus dessh (avec -Nf) puis cochez (ou terminez) avec un autre ssh appeler.

- je l'utiliser dans un projet qui nécessite une inversion du tunnel établi

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 s'assure que la commande ssh échouera si le tunnel ne peut pas être établi, sinon il ne sortira pas.

4
répondu Filipe Pina 2017-05-23 11:47:18

j'ai utilisé paramiko pour un projet que j'ai eu il y a un an, voici la partie de mon code où je me suis connecté avec un autre ordinateur / serveur et ai exécuté un simple fichier python:

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 et sdterr contiennent les entrées/sorties de la commande exécutée.

D'ici, je pense que vous pouvez faire la connexion avec la base de données.

Voici quelques bonnes informations sur paramiko.

3
répondu juliomalegria 2013-04-28 01:24:55