Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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中的mysqldb实现ssh_Python_Mysql_Ssh_Mysql Python - Fatal编程技术网

首先使用python中的mysqldb实现ssh

首先使用python中的mysqldb实现ssh,python,mysql,ssh,mysql-python,Python,Mysql,Ssh,Mysql Python,我正在尝试使用python中的MySQLdb连接到远程服务器上的MySQL数据库。问题是,首先我需要SSH连接到主机,然后从主机连接到MySQL服务器。不过,我遇到的问题是,MySQLdb似乎没有在连接到SQL服务器之前建立SSH连接的方法。我查过文件了,但运气不好 这就是我连接的方式: conn = MySQLdb.connect(host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbna

我正在尝试使用python中的MySQLdb连接到远程服务器上的MySQL数据库。问题是,首先我需要SSH连接到主机,然后从主机连接到MySQL服务器。不过,我遇到的问题是,MySQLdb似乎没有在连接到SQL服务器之前建立SSH连接的方法。我查过文件了,但运气不好

这就是我连接的方式:

conn = MySQLdb.connect(host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')
但我真正需要的是这样的东西:

conn = MySQLdb.connect(sshhost = 'sshhost.domain.com', sshuser = 'sshusername', sshpasswd = 'sshpasswd', host = 'mysqlhost.domain.com:3306', user = 'user', passwd = 'password', db = 'dbname')

这当然是编造出来的。有人能提出建议吗?

在使用MySQLdb.connect之前,先设置一个ssh隧道。隧道将使它看起来像是mysql在本地运行,设置如下

ssh user@host.com -L 9990:localhost:3306
在这里,您的本地端口9990将绑定到远程主机上的3306,-L表示本地,那么9990:localhost:3306表示本地端口: conn=MySQLdb.connect(主机='mysqlhost.domain.com:9990',用户='user',密码='password',数据库='dbname')

请注意9990

将您的用户公钥ssh添加到host.com,这样您就不必在每次设置隧道时键入密码(使用公钥身份验证)


如果您需要在python中执行此操作,可以在python中调用python到ssh绑定库来为您设置隧道。

我更喜欢将隧道保留在python代码中,我不喜欢手动或单独创建隧道,这要感谢sshtunnel库,因为它使用起来非常简单

下面是一些简单的示例,可以满足您的需要

import MySQLdb
from sshtunnel import SSHTunnelForwarder

with SSHTunnelForwarder(
         ('sshhost.domain.com', 22),
         ssh_password="sshpasswd",
         ssh_username="sshusername",
         remote_bind_address=('mysqlhost.domain.com', 3306)) as server:

    conn = MySQLdb.connect(host='127.0.0.1',
                           port=server.local_bind_port,
                           user='user',
                           passwd='password',
                           db='dbname')

试着做一个SSH隧道谢谢。这就成功了。我不得不使用127.0.0.1而不是localhost,以防其他人遇到类似问题。如果远程主机上的mysql db是amazon rdsin sshhost.domain.com,则需要进行哪些更改?您必须使用要连接的SSH机器,该机器可以查看RDS,然后将mysqlhost.domain.com更改为RDS.db.domain.com。应该是这样的。这是迄今为止解决这个问题的最佳答案。我被困了4天,直到我遇到这个解决方案!回答得很好!我只是想补充一点,如果您愿意,您也可以使用pymysql而不是MySQLdb进行连接。其他一切都一样:)谢谢,伙计!