Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.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_Sqlalchemy_Paramiko - Fatal编程技术网

Python 通过SSH连接到MySQL数据库

Python 通过SSH连接到MySQL数据库,python,sqlalchemy,paramiko,Python,Sqlalchemy,Paramiko,我正在尝试通过SSH将python程序连接到远程MySQL数据库 我正在使用Paramiko进行SSH和SQLAlchemy 以下是我到目前为止的情况: import paramiko from sqlalchemy import create_engine ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('host', port=port, use

我正在尝试通过SSH将python程序连接到远程MySQL数据库

我正在使用Paramiko进行SSH和SQLAlchemy

以下是我到目前为止的情况:

import paramiko
from sqlalchemy import create_engine

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('host', port=port, username='user', password='pass')

engine = create_engine('mysql+mysqldb://user:pass@host/db')
我得到一个错误:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2003, "Can't connect to MySQL server on 'mcsdev.croft-it.com' (60)")

对不起,我之前发布了重复的答案。这里有一个更详细的答案,完全符合您的问题;)

如果您仍然需要通过SSH连接到远程MySQL数据库,我已经使用了一个名为sshtunnel的库,它简化了paramiko(sshtunnel的依赖项)的使用

有了这段代码,我想你就可以走了:

from sshtunnel import SSHTunnelForwarder
from sqlalchemy import create_engine

server =  SSHTunnelForwarder(
     ('host', 22),
     ssh_password="password",
     ssh_username="username",
     remote_bind_address=('127.0.0.1', 3306))

server.start()

engine = create_engine('mysql+mysqldb://user:pass@127.0.0.1:%s/db' % server.local_bind_port)

# DO YOUR THINGS

server.stop()
这个代码对我有用

        import pymysql
        import paramiko
        from paramiko import SSHClient
        from sshtunnel import SSHTunnelForwarder
        from sqlalchemy import create_engine

        #ssh config
        mypkey = paramiko.RSAKey.from_private_key_file('your/user/location/.ssh/id_rsa')             
        ssh_host = 'your_ssh_host'
        ssh_user = 'ssh_host_username'
        ssh_port = 22  

        #mysql config         
        sql_hostname = 'your_mysql_host name'
        sql_username = 'mysql_user'
        sql_password = 'mysql_password'
        sql_main_database = 'your_database_name'
        sql_port = 3306
        host = '127.0.0.1'



        with SSHTunnelForwarder(
                (ssh_host, ssh_port),
                ssh_username=ssh_user,
                ssh_pkey=mypkey,
                remote_bind_address=(sql_hostname, sql_port)) as tunnel:              

            engine = create_engine('mysql+pymysql://'+sql_username+':'+sql_password+'@'+host+':'+str(tunnel.local_bind_port)+'/'+sql_main_database)
            connection = engine.connect()
            print('engine creating...')
            sql = text(""" select * from nurse_profiles np limit 50""")
            nurseData = connection.execute(sql)
            connection.close()


            nurseList = []
            for row in nurseData:
                nurseList.append(dict(row))
            print('nurseList len: ', len(nurseList))
            print('nurseList: ', nurseList)
使用外部
ubuntu服务器
使用数字海洋上的ssh密钥

接受的答案对我不起作用,我必须指定
ssh\u private\u key
,这是您的私钥的路径

from sqlalchemy import create_engine
from sshtunnel import SSHTunnelForwarder

server = SSHTunnelForwarder(
     ('133.22.166.19', 22),
     ssh_password="123ABC123",
     ssh_username="erfan",
     ssh_private_key=r'C:\Users\Erfan\.ssh\id_rsa',
     remote_bind_address=('127.0.0.1', 3306)
)

server.start()

engine = create_engine(
    f'mysql+mysqldb://root:safepassword123@127.0.0.1:{server.local_bind_port}'
)
dbs = engine.execute('SHOW DATABASES;')
for db in dbs:
    print(db)

server.stop()

如果服务器已通过主机名可用,为什么不从远程服务器本身授予对数据库的访问权限?通过ssh连接到mysql服务器似乎有点多余,因为程序将分发到许多不同的站点,我们不知道其IP地址。我可以添加一个通配符,但我认为这并不理想,但如果该应用程序运行的每台服务器都有一个公共ip地址(对于ssh部分),则可以连接到数据库本身。但如果我们不知道ip地址,则无法添加它。它也可能在没有静态IPOn的站点上运行。您必须添加允许的主机(可以远程访问数据库的IP)。如果我不知道客户端的IP或客户端没有静态IP,我如何添加它。如果VPS没有远程数据库访问的安全性,那么我同意你的看法。如果你不明白,那没关系。不要浪费你的时间,如果我要用这个烧瓶,我们需要手动处理连接和关闭连接吗?