Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
允许Python通过SSH隧道连接到MySQL_Python_Mysql_Python 2.7_Ssh - Fatal编程技术网

允许Python通过SSH隧道连接到MySQL

允许Python通过SSH隧道连接到MySQL,python,mysql,python-2.7,ssh,Python,Mysql,Python 2.7,Ssh,我在Python2.7中使用MySqldb,以允许Python连接到另一台MySQL服务器 import MySQLdb db = MySQLdb.connect(host="sql.domain.com", user="dev", passwd="*******", db="appdb") 如何使用SSH密钥对通过SSH隧道进行连接,而不是像这样正常连接 SSH隧道最好由Python打开。SSH隧道主机和MySQL服务器是同一台机器。Paramiko是执

我在Python2.7中使用
MySqldb
,以允许Python连接到另一台MySQL服务器

import MySQLdb
db = MySQLdb.connect(host="sql.domain.com",
     user="dev", 
      passwd="*******", 
      db="appdb")
如何使用SSH密钥对通过SSH隧道进行连接,而不是像这样正常连接


SSH隧道最好由Python打开。SSH隧道主机和MySQL服务器是同一台机器。

Paramiko是执行SSH隧道的最佳python模块。请在此处查看代码:

正如在评论中所说的,这一款完美无瑕。
Paramiko是执行ssh隧道的最佳python模块。请在此处查看代码:

正如在评论中所说的,这一款完美无瑕。
我猜您需要端口转发。我推荐
sshtunnel.SSHTunnelForwarder

import mysql.connector
import sshtunnel

with sshtunnel.SSHTunnelForwarder(
        (_host, _ssh_port),
        ssh_username=_username,
        ssh_password=_password,
        remote_bind_address=(_remote_bind_address, _remote_mysql_port),
        local_bind_address=(_local_bind_address, _local_mysql_port)
) as tunnel:
    connection = mysql.connector.connect(
        user=_db_user,
        password=_db_password,
        host=_local_bind_address,
        database=_db_name,
        port=_local_mysql_port)
    ...

我猜你需要港口转运。我推荐
sshtunnel.SSHTunnelForwarder

import mysql.connector
import sshtunnel

with sshtunnel.SSHTunnelForwarder(
        (_host, _ssh_port),
        ssh_username=_username,
        ssh_password=_password,
        remote_bind_address=(_remote_bind_address, _remote_mysql_port),
        local_bind_address=(_local_bind_address, _local_mysql_port)
) as tunnel:
    connection = mysql.connector.connect(
        user=_db_user,
        password=_db_password,
        host=_local_bind_address,
        database=_db_name,
        port=_local_mysql_port)
    ...

只有这个对我有用

import pymysql
import paramiko
import pandas as pd
from paramiko import SSHClient
from sshtunnel import SSHTunnelForwarder
from os.path import expanduser

home = expanduser('~')
mypkey = paramiko.RSAKey.from_private_key_file(home + pkeyfilepath)
# if you want to use ssh password use - ssh_password='your ssh password', bellow

sql_hostname = 'sql_hostname'
sql_username = 'sql_username'
sql_password = 'sql_password'
sql_main_database = 'db_name'
sql_port = 3306
ssh_host = 'ssh_hostname'
ssh_user = 'ssh_username'
ssh_port = 22
sql_ip = '1.1.1.1.1'

with SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_pkey=mypkey,
        remote_bind_address=(sql_hostname, sql_port)) as tunnel:
    conn = pymysql.connect(host='127.0.0.1', user=sql_username,
            passwd=sql_password, db=sql_main_database,
            port=tunnel.local_bind_port)
    query = '''SELECT VERSION();'''
    data = pd.read_sql_query(query, conn)
    conn.close()

只有这个对我有用

import pymysql
import paramiko
import pandas as pd
from paramiko import SSHClient
from sshtunnel import SSHTunnelForwarder
from os.path import expanduser

home = expanduser('~')
mypkey = paramiko.RSAKey.from_private_key_file(home + pkeyfilepath)
# if you want to use ssh password use - ssh_password='your ssh password', bellow

sql_hostname = 'sql_hostname'
sql_username = 'sql_username'
sql_password = 'sql_password'
sql_main_database = 'db_name'
sql_port = 3306
ssh_host = 'ssh_hostname'
ssh_user = 'ssh_username'
ssh_port = 22
sql_ip = '1.1.1.1.1'

with SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_user,
        ssh_pkey=mypkey,
        remote_bind_address=(sql_hostname, sql_port)) as tunnel:
    conn = pymysql.connect(host='127.0.0.1', user=sql_username,
            passwd=sql_password, db=sql_main_database,
            port=tunnel.local_bind_port)
    query = '''SELECT VERSION();'''
    data = pd.read_sql_query(query, conn)
    conn.close()

如果您的私钥文件已加密,这对我来说是有效的:

    mypkey = paramiko.RSAKey.from_private_key_file(<<file location>>, password='password')
    sql_hostname = 'sql_hostname'
    sql_username = 'sql_username'
    sql_password = 'sql_password'
    sql_main_database = 'sql_main_database'
    sql_port = 3306
    ssh_host = 'ssh_host'
    ssh_user = 'ssh_user'
    ssh_port = 22


    with SSHTunnelForwarder(
            (ssh_host, ssh_port),
            ssh_username=ssh_user,
            ssh_pkey=mypkey,
            ssh_password='ssh_password',
            remote_bind_address=(sql_hostname, sql_port)) as tunnel:
        conn = pymysql.connect(host='localhost', user=sql_username,
                               passwd=sql_password, db=sql_main_database,
                               port=tunnel.local_bind_port)
        query = '''SELECT VERSION();'''
        data = pd.read_sql_query(query, conn)
        print(data)
        conn.close()
mypkey=paramiko.RSAKey.from_private_key_文件(,password='password'))
sql\u主机名='sql\u主机名'
sql\u用户名='sql\u用户名'
sql\u密码='sql\u密码'
sql\u主数据库='sql\u主数据库'
sql_端口=3306
ssh\u主机='ssh\u主机'
ssh\u用户='ssh\u用户'
ssh_端口=22
与SSHTunnelForwarder(
(ssh_主机、ssh_端口),
ssh\u用户名=ssh\u用户,
ssh_pkey=mypkey,
ssh\u password='ssh\u password',
远程\u绑定\u地址=(sql\u主机名,sql\u端口))作为隧道:
conn=pymysql.connect(host='localhost',user=sql\u用户名,
passwd=sql\u密码,db=sql\u主数据库,
端口=隧道。本地\u绑定\u端口)
查询=“”“选择版本();“””
data=pd.read\u sql\u查询(查询,连接)
打印(数据)
康涅狄格州关闭

如果您的私钥文件是加密的,这对我来说是有效的:

    mypkey = paramiko.RSAKey.from_private_key_file(<<file location>>, password='password')
    sql_hostname = 'sql_hostname'
    sql_username = 'sql_username'
    sql_password = 'sql_password'
    sql_main_database = 'sql_main_database'
    sql_port = 3306
    ssh_host = 'ssh_host'
    ssh_user = 'ssh_user'
    ssh_port = 22


    with SSHTunnelForwarder(
            (ssh_host, ssh_port),
            ssh_username=ssh_user,
            ssh_pkey=mypkey,
            ssh_password='ssh_password',
            remote_bind_address=(sql_hostname, sql_port)) as tunnel:
        conn = pymysql.connect(host='localhost', user=sql_username,
                               passwd=sql_password, db=sql_main_database,
                               port=tunnel.local_bind_port)
        query = '''SELECT VERSION();'''
        data = pd.read_sql_query(query, conn)
        print(data)
        conn.close()
mypkey=paramiko.RSAKey.from_private_key_文件(,password='password'))
sql\u主机名='sql\u主机名'
sql\u用户名='sql\u用户名'
sql\u密码='sql\u密码'
sql\u主数据库='sql\u主数据库'
sql_端口=3306
ssh\u主机='ssh\u主机'
ssh\u用户='ssh\u用户'
ssh_端口=22
与SSHTunnelForwarder(
(ssh_主机、ssh_端口),
ssh\u用户名=ssh\u用户,
ssh_pkey=mypkey,
ssh\u password='ssh\u password',
远程\u绑定\u地址=(sql\u主机名,sql\u端口))作为隧道:
conn=pymysql.connect(host='localhost',user=sql\u用户名,
passwd=sql\u密码,db=sql\u主数据库,
端口=隧道。本地\u绑定\u端口)
查询=“”“选择版本();“””
data=pd.read\u sql\u查询(查询,连接)
打印(数据)
康涅狄格州关闭

您只能写入私钥文件的路径:
ssh\u pkey='/home/userName/.ssh/id\u ed25519'
(文档在这里:)

如果使用Oracle中的mysql.connector,则必须使用构造
cnx=mysql.connector.MySQLConnection(
。。。 重要提示:一个结构
cnx=mysql.connector.connect(
。。。 无法通过SSh工作!这是一个bug。 (文档在这里:)

此外,您的SQL语句必须是理想的。如果SQL server端出现错误,您不会收到来自SQL server的错误消息

import sshtunnel
import numpy as np

with sshtunnel.SSHTunnelForwarder(ssh_address_or_host='ssh_host',
                                  ssh_username="ssh_username",
                                  ssh_pkey='/home/userName/.ssh/id_ed25519',
                                  remote_bind_address=('localhost', 3306),
                                  ) as tunnel:
    cnx = mysql.connector.MySQLConnection(user='sql_username',
                                          password='sql_password',
                                          host='127.0.0.1',
                                          database='db_name',
                                          port=tunnel.local_bind_port)
    cursor = cnx.cursor()
    cursor.execute('SELECT * FROM db_name.tableName;')
    arr = np.array(cursor.fetchall())
    cursor.close()
    cnx.close()

您只能写入私钥文件的路径:
ssh\u pkey='/home/userName/.ssh/id\u ed25519'
(文档在这里:)

如果使用Oracle中的mysql.connector,则必须使用构造
cnx=mysql.connector.MySQLConnection(
。。。 重要提示:一个结构
cnx=mysql.connector.connect(
。。。 无法通过SSh工作!这是一个bug。 (文档在这里:)

此外,您的SQL语句必须是理想的。如果SQL server端出现错误,您不会收到来自SQL server的错误消息

import sshtunnel
import numpy as np

with sshtunnel.SSHTunnelForwarder(ssh_address_or_host='ssh_host',
                                  ssh_username="ssh_username",
                                  ssh_pkey='/home/userName/.ssh/id_ed25519',
                                  remote_bind_address=('localhost', 3306),
                                  ) as tunnel:
    cnx = mysql.connector.MySQLConnection(user='sql_username',
                                          password='sql_password',
                                          host='127.0.0.1',
                                          database='db_name',
                                          port=tunnel.local_bind_port)
    cursor = cnx.cursor()
    cursor.execute('SELECT * FROM db_name.tableName;')
    arr = np.array(cursor.fetchall())
    cursor.close()
    cnx.close()
归功于


最佳实践是参数化连接变量。 以下是我如何实现的。工作起来很有魅力

import mysql.connector
import sshtunnel
import pandas as pd
import configparser

config = configparser.ConfigParser()
config.read('c:/work/tmf/data_model/tools/config.ini')

ssh_host = config['db_qa01']['SSH_HOST']
ssh_port = int(config['db_qa01']['SSH_PORT'])
ssh_username = config['db_qa01']['SSH_USER']
ssh_pkey = config['db_qa01']['SSH_PKEY']
sql_host = config['db_qa01']['HOST']
sql_port = int(config['db_qa01']['PORT'])
sql_username = config['db_qa01']['USER']
sql_password = config['db_qa01']['PASSWORD']

with sshtunnel.SSHTunnelForwarder(
        (ssh_host,ssh_port),
        ssh_username=ssh_username,
        ssh_pkey=ssh_pkey,
        remote_bind_address=(sql_host, sql_port)) as tunnel:
    connection = mysql.connector.connect(
        host='127.0.0.1',
        port=tunnel.local_bind_port,
        user=sql_username,
        password=sql_password)
    query = 'select version();'
    data = pd.read_sql_query(query, connection)
    print(data)
    connection.close()

最佳实践是参数化连接变量。 以下是我如何实现的。工作起来很有魅力

import mysql.connector
import sshtunnel
import pandas as pd
import configparser

config = configparser.ConfigParser()
config.read('c:/work/tmf/data_model/tools/config.ini')

ssh_host = config['db_qa01']['SSH_HOST']
ssh_port = int(config['db_qa01']['SSH_PORT'])
ssh_username = config['db_qa01']['SSH_USER']
ssh_pkey = config['db_qa01']['SSH_PKEY']
sql_host = config['db_qa01']['HOST']
sql_port = int(config['db_qa01']['PORT'])
sql_username = config['db_qa01']['USER']
sql_password = config['db_qa01']['PASSWORD']

with sshtunnel.SSHTunnelForwarder(
        (ssh_host,ssh_port),
        ssh_username=ssh_username,
        ssh_pkey=ssh_pkey,
        remote_bind_address=(sql_host, sql_port)) as tunnel:
    connection = mysql.connector.connect(
        host='127.0.0.1',
        port=tunnel.local_bind_port,
        user=sql_username,
        password=sql_password)
    query = 'select version();'
    data = pd.read_sql_query(query, connection)
    print(data)
    connection.close()
这对我很有用:

import mysql.connector
import sshtunnel
这对我很有用:

import mysql.connector
import sshtunnel

你用谷歌搜索过吗?用python:打开一个ssh隧道,通过所说的隧道连接到MySql:你可能有很好的理由使用ssh,但是如果这是一个直接连接到MySql服务器的连接,那么就开始使用SSL。出错的事情就少了。@geertjanvdk很有趣,为什么SSL是更好的选择?我正在寻找一个安全的连接在客户端和服务器之间,SSH是第一个想到的。你不使用SSH连接到一个安全的网站,是吗?这只会使事情变得复杂。如果你的MySQL服务器可以直接访问,SSL就是一种方法。此外,SSL可以从任何连接器或操作系统(如Windows)工作。当使用SSH隧道时,你需要保持它,m等等。你用谷歌搜索过吗?用python:打开一个ssh隧道,通过所说的隧道连接到MySql:你可能有很好的理由使用ssh,但如果这是一个直接连接到MySql服务器的连接,那么就开始使用SSL。出错的事情就少了。@geertjanvdk这很有趣,为什么SSL会是更好的选择?我正在寻找答案客户端和服务器之间的ecure连接以及SSH是第一个想到的。您不使用SSH连接到安全的网站,是吗?这只会使事情变得复杂。如果您的MySQL服务器可以直接访问,SSL就是一种方法。此外,SSL可以从任何连接器或操作系统(如Windows)工作。使用SSH隧道时,您需要为了保持它,监视它,等等。我应该在远程绑定地址中放什么?我在哪里可以找到这些信息?如果你在本地,你可以尝试这样的方法:
\u远程绑定地址='127.0.0.1'\u本地绑定地址='0.0.0'
这是什么类型的转发?R