带有跳转主机和远程数据库的SSH隧道转发

2024-06-22

我有一个托管在 Amazon RDS (“D”) 上的远程 MySQL 数据库。出于安全目的,只能通过远程服务器(“C”)访问它。 C 可以通过跳转主机“B”通过 ssh 访问。我需要一个双 ssh 隧道来访问远程 SQL 主机。

[A: local host] -> [B: jump host] -> [C: target host] => [D: RDS MySQL host]

我想使用 paramiko 和/或 sshtunnel 通过 Python 访问 D。我能找到的所有信息涉及:

  • a single ssh tunnel and a remote SQL host (ex. A -> C => D, no jump host)
    • 首先在 python 中使用 mysqldb 进行 ssh https://stackoverflow.com/a/31890160/6412017
    • python 通过 ssh 连接 mysql https://stackoverflow.com/a/33016779/6412017
  • a double ssh tunnel to an SQL host (ex. A -> B -> C, D is hosted on C).
    • 使用 python 通过 ssh 隧道连接到远程 Postgresql 数据库 https://stackoverflow.com/a/31890133/6412017
    • Paramiko:NAT 路由器周围的端口转发 https://stackoverflow.com/a/19039769/6412017
    • 与 Paramiko 的嵌套 SSH 会话 https://stackoverflow.com/a/10432669/6412017

到目前为止,我使用 paramiko 和代理命令从 A 到 C。我可以通过在 C 上执行命令来访问 D,但不能通过连接 mysqldb 或 sqlalchemy(我的最终目标)来访问 D。

我当前的代码:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
proxy = paramiko.ProxyCommand("ssh -A B_username@B_host -W C_host:12345")
ssh.connect("C_host", username="C_username", sock=proxy)

stdin, stdout, stderr = ssh.exec_command("mysql -u D_username -p D_password -h D_host_rds")
print("STDOUT:\n{}\n\nSTDERR:\n{}\n".format(stdout.read(), stderr.read()))
# successfully prints out MySQL welcome screen

我正在寻找类似的东西(根据示例2进行修改)ssh隧道文档 https://pypi.python.org/pypi/sshtunnel):

import paramiko
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
    intermediate = {
        ("B_host", 22),
        ssh_username = "B_username",
        ssh_password = "B_password")},
    remote = {
        ("C_host", 12345),
        ssh_username = "C_username",
        ssh_password = "C_password")},
    remote_bind_address=("D_host_rds", 3306),
    local_bind_address=("0.0.0.0", 3307)) as server:

    conn = MySQLdb.connect(
        user = "D_username",
        passwd = "D_password",
        db = "my_database",
        host = "127.0.0.1",
        port = 3307)

tl;dr:如何在Python中通过两次ssh跳转来转发端口?


我想到了。它与 ssh 配置设置和 SSHTunnelForwarder 上下文管理器的组合一起使用ssh隧道 https://sshtunnel.readthedocs.io/en/latest/图书馆。

使用以下模型和命名约定 https://i.stack.imgur.com/94xHh.png:

[A: local host] -> [B: jump host] -> [C: target host] => [D: RDS MySQL host]

我将 ~/.ssh/config 设置为通过 B 从 A 到 C:

Host C_ssh_shortcut
    HostName C_host
    User C_user
    Port 22
    ForwardAgent yes
    ProxyCommand ssh B_user@B_host -W %h:%p

我将用于登录 B 和 C 的密钥添加到我的 ssh-agent 中:

ssh-add

最后我设置了 SSHTunnelForwarder:

import sqlalchemy
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
    "C_ssh_shortcut",                     # The SSHTunnelForwarder "ssh_address_or_host" argument, which takes care of bypassing B through the ProxyCommand set up in ~/.ssh/config
    remote_bind_address=(D_host, 3306),   # Points to your desired destination, ie. database host on 3306, which is the MySQL port
    local_bind_address=('', 1111)         # Gives a local way to access this host and port on your machine. '' is localhost / 127.0.0.1, 1111 is an unused port
) as server:
    connection_string = "mysql+pymysql://D_user:D_password@localhost:1111/D_dbname"  # note that D_host and D_port were replaced by the host and port defined in "local_bind_address"
    engine = sqlalchemy.create_engine(connection_string)
    # do your thing

从这里,我可以像往常一样使用我的引擎与我的数据库进行交互。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有跳转主机和远程数据库的SSH隧道转发 的相关文章

  • 如何在 Pandas 中用多个唯一字符串替换重复值?

    import pandas as pd import numpy as np data Name Tom Tom Jack Terry Age 20 21 19 18 df pd DataFrame data 假设我有一个如下所示的数据框
  • 在ubuntu中安装pyinterval

    我正在尝试安装 python 库 pyinterval 它需要 crlibm C 标头 我已安装该标头 没有错误 但似乎是问题的根源 当我跑步时 sudo easy install pyinterval 我得到以下信息 Searching
  • 尝试打开 Excel 时出现“KeyError:“存档中没有名为“xl/sharedStrings.xml”的项目”

    我正在尝试使用 Python 脚本将数据导入 PowerBi 以便我可以安排它定期刷新数据 我面临着从 Excel 文件获取数据并收到错误的挑战 KeyError 没有名为 xl sharedStrings xml 的项目在档案中 导入时
  • 如何在Tensorflow中读取json文件?

    我正在尝试编写一个函数 用于读取张量流中的 json 文件 json 文件具有以下结构 bounding box y 98 5 x 94 0 height 197 width 188 rotation yaw 27 970195770263
  • AMLS 实验运行停留在“正在运行”状态

    我运行了 Azure 机器学习服务实验 并使用 Jupyter Notebook 记录了神经网络损失 日志记录工作正常 神经网络训练也按预期完成 但实验一直停留在运行状态 关闭计算资源不会关闭实验运行 我无法从实验面板取消它 此外 运行没有
  • 按日期和时间降序排序?

    全部 我想显示特定 id 最后输入的 5 条数据 我的sql查询是 SELECT id name form id DATE updated at as date FROM wp frm items WHERE user id 11 form
  • 视频的 EXIF 之类的东西

    有没有从视频文件中获取信息的标准方法 对于图像 我们有 EXIF 数据 可用于获取有关图像文件的日期 时间 大小等信息 我想知道视频是否也有这样的东西 用例是 我有很多用数码相机拍摄的视频 我想将它们重命名为更有意义的名称 例如 YYYY
  • JOOQ初始化DAO最佳方法

    我想知道初始化 JOOQ 生成 DAO 的最佳实践 现在 我使用以下方法来初始化 JOOQ 生成的 DAO 在以下情况下 Student Dao 是 JOOQ 生成的 public class ExtendedStudentDAO exte
  • tkinter - 在askopenfile期间检索文件名

    我有一个用 Python 和 tkinter 制作的文本编辑器 这是我的 打开文件 方法 def onOpen self file askopenfile filetypes Text files txt txt file read sel
  • 将 SQL 查询的 SELECT 子句解析为 PHP 数组

    这更多的是用于分析 PHP 中的查询before它被发送到服务器 我这样做的原因非常复杂 所以我不想深究其原因 在 PHP 中 我需要将字段选择存储到 PHP 数组中 以这个查询为例 SELECT user id username DATE
  • Pygame - 两个圆圈的碰撞检测

    我正在制作一个碰撞检测程序 其中我的光标是一个半径为 20 的圆 当它碰到另一个圆时应该将值更改为 TRUE 出于测试目的 我在屏幕中心有一个半径为 50 的固定圆 我可以测试光标圆是否击中固定圆 但它不能正常工作 因为它实际上是在测试它是
  • 重置Keras模型的所有权重

    我希望能够重置整个 Keras 模型的权重 这样我就不必再次编译它 编译模型目前是我的代码的主要瓶颈 这是我的意思的一个例子 import tensorflow as tf model tf keras Sequential tf kera
  • 如何向 Iron Python 添加模块?

    我一直在尝试使用 C Visual Studio 执行以下 Python 代码 graphcreater py 我通过 NuGet 包管理器添加了 IronPyton 2 7 7 和 IronPython StdLib 2 7 7 一旦我运
  • Python Selenium 将内容添加到 pandas 数据帧

    我正在尝试循环list用于抓取内容的邮政编码this url http kadastralekaart com 但我面临着错误 例如TimeoutException and StaleElementReferenceException 我该
  • 从线程队列中获取所有项目

    我有一个线程将结果写入队列 在另一个线程 GUI 中 我定期 在 IDLE 事件中 检查队列中是否有结果 如下所示 def queue get all q items while 1 try items append q get nowai
  • Python Blowfish 加密

    由于我对 Java 的了解不完整 我正在努力将此加密代码转换为 Python 代码 两者应该得到完全相同的结果 帮助将不胜感激 Java函数 import javax crypto Cipher import javax crypto sp
  • pandas 数据帧和聚合中的行明智排序

    我在 pandas dataframe df 中有一个表 col1 col2 count 12 15 3 13 17 5 1 36 4 15 12 7 36 1 4 等等 我想要的是将 12 和 15 和 15 和 12 等计算值视为相同
  • Windows 版 Git - 每次推送时都要求输入 SSH 密码

    我今天安装了 Windows 版 git 并做了一些测试 我发现每次推送时都会要求我输入密码 Linux 上不会发生这种情况 我对另一个线程提出了一些建议 我发现我没有配置 ssh agent 但我这样做了 问题仍然存在 有什么建议吗 谢谢
  • JavaFX ComboBox - 显示文本但在选择时返回 ID

    我有一个包含机场的数据库表 每个机场都有一个名称和一个 ID 在 JavaFX 中我有一个表单 其中包含ComboBox 组合框需要显示所有机场名称 并且在提交表单时需要将机场的 ID 插入数据库 而不是其名称 但我并没有真正弄清楚解决方案
  • Dash ImportError:无法从“werkzeug.debug.tbtools”导入名称“get_current_traceback”

    我正在尝试在 Pycharm 的 conda 环境中运行一个简单的破折号应用程序 但是我遇到了标题中的错误 奇怪的是 我在互联网上找不到提到这个错误的地方 除了here https community plotly com t dash w

随机推荐