允许Python通过SSH隧道连接到MySQL
我在Python2.7中使用允许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是执
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