Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

安全起见,数据库的访问多半是要做限制的,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常使用造成了很大不便。所以前几天做了个需求,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库。

经人推荐,查询了一个工具叫sshtunnel ,需要在你想要登录数据库的机器上安装。

sshtunnel的基本介绍 : http://sshtunnel.readthedocs.io/en/latest/?badge=latest

这里边的图2,正好是我们描述的场景,数据库在远程某台服务器上,只能同在一起的另一台服务器才能访问,但是我们本地就需要ssh到这台服务器上

但是这个里边涉及到的代码是服务器相关,远程连接的是服务器,我们需要的是远程服务器的数据库,这个也一样,只需要变更代码中后半部分就可以了。

原代码是下边这样:

 1 import paramiko
 2 from sshtunnel import SSHTunnelForwarder
 3
 4 with SSHTunnelForwarder(
 5     (REMOTE_SERVER_IP, 443),
 6     ssh_username="",
 7     ssh_pkey="/var/ssh/rsa_key",
 8     ssh_private_key_password="secret",
 9     remote_bind_address=(PRIVATE_SERVER_IP, 22),
10     local_bind_address=(‘0.0.0.0‘, 10022)
11 ) as tunnel:
12     client = paramiko.SSHClient()
13     client.load_system_host_keys()
14     client.set_missing_host_key_policy(paramko.AutoAddPolicy())
15     client.connect(‘127.0.0.1‘, 10022)
16     # do some operations with client session
17     client.close()
18
19 print(‘FINISH!‘)

连接mysql数据库

连接mysql数据库的时候,看到网上有一位程序员已经实现了: python 使用mysqldb模块通过ssh隧道连接mysql

代码如下:

 1 import MySQLdb
 2 from sshtunnel import SSHTunnelForwarder
 3
 4 with SSHTunnelForwarder(
 5          (‘sshhost.domain.com‘, 22),    #B机器的配置
 6          ssh_password="sshpasswd",
 7          ssh_username="sshusername",
 8          remote_bind_address=(‘mysqlhost.domain.com‘, mysql.port)) as server:  #A机器的配置
 9
10     conn = MySQLdb.connect(host=‘127.0.0.1‘,              #此处必须是是127.0.0.1
11                            port=server.local_bind_port,
12                            user=‘user‘,
13                            passwd=‘password‘,
14                            db=‘dbname‘)

然后接下来的查询什么的,直接写在with那里边,与conn对齐就可以了。

对于我这边来说有一个问题是,因为我们对于数据库连接这一部分,往往是在一个单独的函数里,与其他数据库的查询插入删除更新操作往往不在一起,这样的话,with as 有个特点就是,离开这块作用域,对象就被销毁掉了,别的函数里是没法用的,也就会出现一种情况是,连接上了,但是对象又给销毁掉了,结果查询的时候直接显示这个错误:OperationalError: (2006, ‘MySQL server has gone away‘), 而网上查询这个错误,多半说的是因为你查询的 sql操作的时间过长,或者是传送的数据太大 ,但是我这个地方实际上就是因为出了with as 的作用域,导致连接又给关闭掉了,所以出现这样的结果。

关于 with as ,有篇文章写得很详尽。理解Python中的with…as…语法

所以我把上边那个ssh代码改掉了,像是sshtunnel文档里边图一所对应的代码,一样,将SSHTunnelForwarder出来的对象赋值给server,然后启动server,然后进行一系列操作之后,再stop掉。

本来数据库连接我们写成了一个单独的函数,改了之后,直接也还放在这个函数里就好了,替代原来的connect语句。

 1 def connect(self):
 2     ‘‘‘
 3     self.client = MySQLdb.connect(host=self.server, port=self.port, user=self.user,
 4                                   passwd=self.password, db=self.database,
 5                                   charset=self.charset)
 6     # log.info(‘Connect to MySQL Server: ‘ + self.server)
 7     ‘‘‘
 8
 9     server = SSHTunnelForwarder(
10             (‘sshhost.domain.com‘, 22),  # B机器的配置
11             ssh_password=‘ssh_password‘,
12             ssh_username=‘ssh_username‘,
13             remote_bind_address=(‘mysqlhost.domain.com‘, mysql.port)
14     )
15     server.start()
16
17     self.client = MySQLdb.connect(host=‘127.0.0.1‘,  # 此处必须是是127.0.0.1
18                                   port=server.local_bind_port,
19                                   user=‘username‘,
20                                   passwd=‘password‘,
21                                   db=‘dbname‘)

然后在进行查询更新删除等操作的时候,先连接一下数据库就好了,用self.client.

连接sqlserver数据库

跟mysql的一致,但是db那里要注意,SQLServer的是database, 然后是pymssql.connect就可以了,但是这个地方还要说我踩过的一个坑,我写完sqlserver之后怎么连接都连不上数据库,后来才发现是版本的问题,我把本地SQLServer更新了之后就可以了。感觉版本是个大坑

				
时间: 2025-01-04 15:13:59

Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库的相关文章

解决"System.AccessViolationException”类型的未经处理的异常在 未知模块(IIS Worker Process 已停止工作)导致无法连接远程数据库的问题

解决方法: 用管理员身份运行CMD,输入netsh winsock reset并回车(注意,必须是已管理员身份运行,这个重置LSP连接) 解决"System.AccessViolationException"类型的未经处理的异常在 未知模块(IIS Worker Process 已停止工作)导致无法连接远程数据库的问题

sqlplus连接远程数据库

sqlplus连接远程数据库 作者:zhou__zhou **************sqlplus 连接远程数据库系统********************** 方式一:简易连接,不用进行网络配置,其实就是tnsname.ora文件,但只支持oracle10G以上.命令:sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba]示例:sqlplus sys/[email protected]:1521/test as sysdba 备注:使用默认152

解决SQL Server管理器无法连接远程数据库Error: 1326错误

解决SQL Server管理器无法连接远程数据库Error: 1326错误 我们在在使用SQL Server时都会遇到使用SQL Server Management Studio无法连接远程数据库实例的问题,错误描述信息摘录如下: An error has occurred while establishing a connection to the server. (provider: Named Pipes Provider, error: 40 – Could not open a con

oracle 9i 安装及连接远程数据库

用oracle 11g很久了,真的感觉是一个很重量级的客户端,安装都要一个多小时,最近刚开始接触这种精简版的数据库客户端,捣鼓了半天,总算成功. 1.下载客户端 2.安装 傻瓜式安装即可,记得自己的路径. 3.配置环境变量 path变量在最前面添加刚刚安装的路径,每个人都不同,见仁见智哈,c:\Oracle\ora90\bin nls_lang变量:SIMPLIFIED CHINESE_CHINA.ZHS16GBK(这是配置数据库语言为中文) oracle_home:c:\Oracle\ora9

通过IIS不能连接远程数据库的问题

近期遇到一个奇怪的问题:在调试MES程序时发现,如果连接的是远程的SQL SERVER数据库(通过了IIS),则提示连接失败,就是经常见到的数据库不允许远程连接的错误提示: 而且又测试了以下几种情况: 1. 在芜湖与石家庄都遇到这种情况,而且数据库服务器端未做任何改动: 2. 使用IIS连接本地的数据库正常: 3. 别人的机器在调试程序时可以正常地连接远程数据库: 4. 使用本人机器的SQL SERVER客户端可以正常访问远程数据库: 5. 使用本人机器,不使用IIS,直接使用最基本的代码连接远

pl/sql developer连接远程数据库

本地不安装oracle client程序,直接使用pl/sql developer连接远程数据库 考虑到机子本身资源有限,一个client会占用很多资源,尝试使用不安装客户端的方式进行远程连接. 需要软件:instantclient-basic-win32-10.2.0.5.zip.pl/sql developer 过程如下:将instantclient-basic-win32-10.2.0.5.zip解压缩到任意目录下,目录文件夹名称要求不能有括号什么的,在该目录下创建NETWORK文件夹,进

Win7 64位安装VS2013无法连接远程数据库

win7 64位安装vs2013后连接远程数据库出现下面的问题:A first chance exception of type 'System.AccessViolationException' occurred in System.Data.dll Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corru

PL/SQL Developer怎么连接远程数据库

首先打开电脑,到PL/SQL安装的指定目录 [D:\app\DZL\product\10.2.0\dbhome_1\NETWORK\ADMIN]或者[D:\oracle\product\10.2.0\db_1\network\ADMIN]或者是不登录进入PL/SQL如图 找到你的安装路径经再找到..\network\ADMIN下的[tnsnames.ora] 打开[tnsnames.ora]文件,增加你需要远程连接的字符串.例如: XXXX =  (DESCRIPTION =    (ADDRE

PLSQL DEVELOPER 连接远程数据库 OCI客户端安装方法

安装使用过PLSQL Dev都知道,要连接数据库,必须配置TNS(Transparence Network Substrate),而直接安装PLSQL Dev 之后,本机是没有Oracle HOME的注册表项,连网络连接配置项都没有,PLSQL Dev 就是一个文本编辑器而已. PLSQL Dev 连接远程oracle的一个有效解决方法使使用OCI.ORACLE调用接口(Oracle Call Interface简称OCI)提供了一组可对ORACLE数据库进行存取的接口函数,通过在第三代程序设计