Psycopg2 accès PostgreSQL databese sur l'hôte distant sans l'ouvrir manuellement le tunnel ssh
Ma procédure standard de PostgreSQL pour accéder à une base de données sur un serveur distant est ouvert d'abord créer un tunnel ssh:
ssh username1@remote.somewhere.com -L 5432:localhost:5432 -p 222
puis exécute ma requête en python à partir d'un autre shell que:
conn = psycopg2.connect("host=localhost" + " dbname=" +
conf.dbname + " user=" + conf.user +
" password=" + conf.password)
cur = conn.cursor()
cur.execute(query)
Ce morceau de code python fonctionne très bien, une fois que le tunnel est créé. Cependant, je voudrais psycopg2 à déjà ouvert le tunnel SSH ou à portée de main "en quelque sorte" à la base de données à distance sans avoir besoin de le rediriger sur mon localhost.
Est-il possible de faire cela avec psycopg2?
Est par ailleurs possible d'ouvrir le tunnel ssh dans mon code python?
si j'utilise:
os.system("ssh [email protected] -L 5432:localhost:5432 -p 222")
Le shell va être redirigé vers l'hôte distant blocage de l'exécution du thread principal.
OriginalL'auteur Luca Fiaschi | 2014-02-26
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également utiliser sshtunnel, court et doux:
utilisation
ssh_pkey
etssh_private_key_password
mot-clé arguments comme indiqué dans le sshtunnel.readthedocs.org/en/latest. E. g.SSHTunnelForwarder(..., ssh_pkey='/path/to/keyfile', ssh_private_key_password='secret', ...)
OriginalL'auteur mrts
Appelez votre ssh via
os.system
dans un autre thread/processus. Vous pouvez également utiliser-N
avec ssh afin d'éviter l'ouverture d'un shell distant.Cela est une condition de course. Exécuter
ssh
avec-v
à l'aide de lasubprocess
module au lieu deos.system
et attendez que le ssh de sortie quand il dit "le renvoi Local d'écoute" dans la sortie. Utiliser unthreading.Event
pour synchroniser l'appelant à l'appelé.Pourriez vous s'il vous plaît fournir le code?
OriginalL'auteur piro
Clodoaldo Neto code a fonctionné parfaitement pour moi mais attention il ne nettoie pas le processus par la suite.
La méthode indiquée par Luca Fiaschi fonctionne aussi pour moi. J'ai mis à jour un peu pour python3 et la mise à jour psutil module. Les changements ne s'agit que de processus.nom d'utilisateur et le processus.cmdline sont désormais les fonctions et que l'itérateur est process_iter() au lieu de get_process_list().
Voici un exemple d'une version légèrement modifiée du code de Luca Fiaschi posté qui fonctionne avec python3 (nécessite psutil module). J'espère que c'est au moins la plupart du temps correct!
Il semble que la seule fois où l'auto.ssh_tunnel est accessible est dans SSHTunnel.la libération. Si cette variable n'existe pas, je parie que soi.ssh_tunnel n'est pas de définir ce qui signifie ssh_processes n'est pas le remplissage avec des processus. Comment êtes-vous invoquer ssh (la variable "commande"), et ne l'invocation de la commande par lui-même dans un shell execute? Aussi, je vais modifier le script pour qu'il soit pas d'erreur.
OriginalL'auteur mathewguest
Pour le moment je suis en utilisant une solution bsed sur ce gist:
S'il vous plaît laissez-moi savoir si quelqu'un a une meilleure idée
N'est-il pas une erreur dans le script? ssh_tunnel n'a pas été définie auparavant.
OriginalL'auteur Luca Fiaschi
Il n'y a rien à être exécuté dans cette réponse. La seule chose qu'il fait est d'établir une connexion ssh et se connecter à la base de données comme demandé. Qu'attendiez-vous?
Il ne se connecte à la base de données sur mon système, ou je suis geting pas de retour de votre solution. Curseur juste clignote et nous sommes "pris" dans l'option "-N". Je suis allé avec des sous-processus. os.le système peut être considérée comme obsolète.
OriginalL'auteur Clodoaldo Neto