我在用 MySqldb 使用python2.7允许python连接到另一个mysql服务器
MySqldb
import MySQLdb db = MySQLdb.connect(host="sql.domain.com", user="dev", passwd="*******", db="appdb")
不是像这样正常连接,而是如何使用ssh密钥对通过ssh隧道进行连接?ssh隧道最好由python打开。ssh隧道主机和mysql服务器是同一台机器。
zour9fqk1#
这对我很有用:
import mysql.connector import sshtunnel
with sshtunnel.SSHTunnelForwarder( ('ip-of-ssh-server', 'port-in-number-format'), ssh_username = 'ssh-username', ssh_password = 'ssh-password', remote_bind_address = ('127.0.0.1', 3306) ) as tunnel: connection = mysql.connector.connect( user = 'database-username', password = 'database-password', host = '127.0.0.1', port = tunnel.local_bind_port, database = 'databasename', ) mycursor = connection.cursor() query = "SELECT * FROM datos" mycursor.execute(query)
zqdjd7g92#
如果你的私钥文件是加密的,这就是我的工作原理:
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()
rqqzpn5f3#
from sshtunnel import SSHTunnelForwarder import pymysql import pandas as pd tunnel = SSHTunnelForwarder(('SSH_HOST', 22), ssh_password=SSH_PASS, ssh_username=SSH_UNAME, remote_bind_address=(DB_HOST, 3306)) tunnel.start() conn = pymysql.connect(host='127.0.0.1', user=DB_UNAME, passwd=DB_PASS, port=tunnel.local_bind_port) data = pd.read_sql_query("SHOW DATABASES;", conn)
贷记https://www.reddit.com/r/learnpython/comments/53wph1/connecting_to_a_mysql_database_in_a_python_script/
y0u0uwnf4#
只能将路径写入私钥文件: ssh_pkey='/home/userName/.ssh/id_ed25519' (文件如下:https://sshtunnel.readthedocs.io/en/latest/).如果使用oracle的mysql.connector,则必须使用构造 cnx = mysql.connector.MySQLConnection( ... 重要提示:a构造 cnx = mysql.connector.connect( ... 无法通过ssh工作!它是一只虫子(文件如下:https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html).另外,您的sql语句必须是理想的。如果sql server端发生错误,则不会收到来自sql server的错误消息。
ssh_pkey='/home/userName/.ssh/id_ed25519'
cnx = mysql.connector.MySQLConnection(
cnx = mysql.connector.connect(
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()
nwo49xxi5#
最佳实践是参数化连接变量。下面是我如何实现的。很有魅力!
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()
9vw9lbht6#
paramiko是执行ssh隧道的最佳python模块。请在此处查看代码:https://github.com/paramiko/paramiko/blob/master/demos/forward.py正如在评论中所说的,这个很好用。python mysqldb连接的ssh隧道
zdwk9cvp7#
只有这个对我有用
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()
ylamdve68#
我猜你需要港口转运。我推荐 sshtunnel.SSHTunnelForwarder ```import mysql.connectorimport sshtunnel
sshtunnel.SSHTunnelForwarder
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)...
8条答案
按热度按时间zour9fqk1#
这对我很有用:
zqdjd7g92#
如果你的私钥文件是加密的,这就是我的工作原理:
rqqzpn5f3#
贷记https://www.reddit.com/r/learnpython/comments/53wph1/connecting_to_a_mysql_database_in_a_python_script/
y0u0uwnf4#
只能将路径写入私钥文件:
ssh_pkey='/home/userName/.ssh/id_ed25519'
(文件如下:https://sshtunnel.readthedocs.io/en/latest/).如果使用oracle的mysql.connector,则必须使用构造
cnx = mysql.connector.MySQLConnection(
... 重要提示:a构造cnx = mysql.connector.connect(
... 无法通过ssh工作!它是一只虫子(文件如下:https://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html).另外,您的sql语句必须是理想的。如果sql server端发生错误,则不会收到来自sql server的错误消息。
nwo49xxi5#
最佳实践是参数化连接变量。下面是我如何实现的。很有魅力!
9vw9lbht6#
paramiko是执行ssh隧道的最佳python模块。请在此处查看代码:https://github.com/paramiko/paramiko/blob/master/demos/forward.py
正如在评论中所说的,这个很好用。python mysqldb连接的ssh隧道
zdwk9cvp7#
只有这个对我有用
ylamdve68#
我猜你需要港口转运。我推荐
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)
...