- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40091 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12738
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
4 T- R, Q: t2 y涉及库:pymssql、sshtunnel
" @9 f6 }1 o8 `; f涉及数据库:SQLSERVER* d1 Z5 `( `3 K( q. X( e
+ g! Y$ ]7 i! S- I
场景如下: 4 x$ P) y) h1 R
跳板机核心代码 def __get_ssh_connector(self): # 远程连接
# f" Q; s1 Q5 q; L # 跳板机地址 端口,服务器账号,密码配置7 o/ ^1 S. L1 g' ^+ t& f+ O
server = SSHTunnelForwarder(
1 h X+ g, j* V8 j+ G* ? (
6 S% M( u' O9 y* r5 a( ~ self.connect_config.get("ssh_host", ‘白名单服务器地址’),
+ T, o* x0 U4 h0 Z+ N5 n7 t, m self.connect_config.get("ssh_port", 22)* ?6 ]4 p3 s5 o6 ]; f
),, @/ S4 l, j4 `) U: V
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),4 S' @ u$ @( C8 e6 k# ?
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
( p5 ~4 k, b( `! M # 内网数据库地址和端口
0 j( ^9 z- E. O( P remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
% C8 }5 L2 ~5 |- {# y )7 \: w% Q1 `3 P8 I; E' N$ t
server.start()7 t& B/ ?: c. v8 N2 Y% O
return server # 远程主机上的mssql通过ssh连接映射到本地的端口; w( L/ t: j2 D' J- P
pymssql 连接数据库核心代码
. m7 r5 G. i3 G0 t' [4 i6 N def get_mssql_connector(self):
# J$ m1 J2 ]$ B3 v- o return get_mssql_connector({9 F( j8 H* a" d. o1 Z! l! f
"port": self.server.local_bind_port, #非常重要
" }# ~! M# x0 ? "username": ‘目标数据库账号’,
+ ? @ J4 y) ]& M "password": ‘目标数据库密码’,
" u: E" F! {3 n9 g' P* N0 p "db": self.connect_config.get('db', ‘目标数据库’)
1 X9 ?# \8 N6 A( z })+ I; T8 ?4 p0 L# H( X
" @& t4 L2 r8 G
def __get_mssql_connector(database_config):
- g) ~- ~. [, J4 {" L8 `, M host = database_config.get('host', '127.0.0.1')
3 c1 u; V& _# X3 N v; S5 a3 A& o port = database_config.get('port', ‘数据库端口’)
. p' ?* I( R- |. G7 O user = database_config.get('username', ‘目标数据库账号’)5 q6 [, W+ r2 u: b$ h/ z( E' u' [
passwd = database_config.get('password', ‘目标数据库密码’)
) l, k4 x# I5 g4 u9 y3 T db = database_config.get('db', ‘目标数据库’)& w4 n5 Q8 K" a" G) ]8 j# D8 D: ?
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
1 ]) J# `3 o+ t6 p+ J) N1 K
g Y+ l9 g0 S! k! `MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
+ P& G, L; A2 R% T! j0 y. h. S) v0 O0 Y' [& R; X$ S# p
|
zan
|