Я изучаю python. Мне нужно, чтобы создатели туннеля читали информацию из базы данных и закрывали туннель. Я использую paramiko, но я не работал с примером tonlem. пожалуйста, дайте пример простого кода, создающего туннель.
Спасибо заранее!
Я изучаю python. Мне нужно, чтобы создатели туннеля читали информацию из базы данных и закрывали туннель. Я использую paramiko, но я не работал с примером tonlem. пожалуйста, дайте пример простого кода, создающего туннель.
Спасибо заранее!
На работе мы обычно создаем порты пересылки ssh-туннелей. Мы делаем это, используя стандартную команду ssh -L port:addr:port addr
с подпроцессом, работающим в отдельном потоке. Я нашел эту полезную ссылку: https://github.com/paramiko/paramiko/blob/master/demos/forward.py с примером выполнения переадресации портов с помощью paramiko.
Я использовал sshtunnel
для моих проектов. Пример перенаправления удаленного локального порта MySQL на локальный порт хоста:
pip install sshtunnel
python -m sshtunnel -U root -P password -L :3306 -R 127.0.0.1:3306 -p 2222 localhost
Даже несмотря на то, что это не использует paramiko, я считаю это очень простым решением для реализации (аналогично @dario answer, но без управления потоком в python).
Вот эта малоизвестная функция в клиенте openssh, которая позволяет нам управлять процессом ssh через unix-сокет, цитируя 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.
Итак, вы можете начать фоновый процесс ssh
(с помощью -Nf
), а затем проверить (или завершить его) другим вызовом ssh
.
Я использую это в проекте, который требует установки обратного туннеля
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
гарантирует, что команда ssh не будет работать, если туннель не может быть установлен, иначе он не выйдет.
Я использовал paramiko
для некоторого проекта, который у меня был год назад, вот часть моего кода, где я был связан с другим компьютером /server и выполнил простой файл 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
и sdterr
содержат входы/выходы команды, которую вы выполнили.
Отсюда я думаю, что вы можете установить соединение с базой данных.