- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40245 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12785
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
2 T* a' _7 }* X: M涉及库:pymssql、sshtunnel6 Q: @& r2 N6 c* @
涉及数据库:SQLSERVER. a5 L' r8 Z' H/ {% b& O0 Q; h/ A
7 H2 ?. c ^) K2 ^' ^
场景如下: 8 w K) P! T/ U+ k5 _* T
跳板机核心代码 def __get_ssh_connector(self): # 远程连接2 Y" x% j7 J1 O/ t1 w; s+ u
# 跳板机地址 端口,服务器账号,密码配置
" K- b% g) n& z0 K+ r2 t$ A M7 U8 v server = SSHTunnelForwarder($ k/ w) F, p$ d* D
(
0 G: D4 l/ Q" O" T" F/ k. _ self.connect_config.get("ssh_host", ‘白名单服务器地址’),9 d4 _) ?* @1 ]- J* j* W
self.connect_config.get("ssh_port", 22)* n# ~( r0 S( @0 k+ u f
),# ?$ ], w7 G+ q z9 N
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
9 r6 I1 c, ]9 X) |# B3 E) h4 A ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
; U g0 P# L$ V6 u& @8 `6 j" S- E6 s # 内网数据库地址和端口
2 q! n5 [! s$ Z( w/ h" W remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
1 U. i, E6 i+ m: |$ f )
# g. p7 d+ c# G8 b! x server.start()
. c$ d3 u( v- D) ~2 W. U+ a! r return server # 远程主机上的mssql通过ssh连接映射到本地的端口2 @4 S6 b# L2 |: `( G$ ^: ~; G4 D
pymssql 连接数据库核心代码 # r* x) }" N) Y" `; c3 n! [
def get_mssql_connector(self):8 n" o5 ?3 s6 h* W
return get_mssql_connector({+ V5 \; s# \/ b7 B1 F0 ~, k( R
"port": self.server.local_bind_port, #非常重要/ D( Y+ v" Z6 \- x% m
"username": ‘目标数据库账号’,
; H2 f$ q3 ~) ]; _ "password": ‘目标数据库密码’,
: M, T8 J' [9 J1 n, A9 { "db": self.connect_config.get('db', ‘目标数据库’)
# T9 y6 U8 [2 O0 ]+ R* x })% B4 H6 U& I7 J3 k9 l7 c3 r! }
/ i/ f% W" |1 \* J& r. q, F
def __get_mssql_connector(database_config):6 V8 H: }1 d2 W* P" |$ Z' U. f; m
host = database_config.get('host', '127.0.0.1')
" o: W+ q; \7 X7 h3 M3 o9 Q% w port = database_config.get('port', ‘数据库端口’) H( [+ b1 d9 N: y6 O
user = database_config.get('username', ‘目标数据库账号’)4 a* K( R+ n6 c6 Z9 [$ [, x: ~/ i
passwd = database_config.get('password', ‘目标数据库密码’)
7 ^4 @$ r* H; V* z" A# U6 h db = database_config.get('db', ‘目标数据库’)
8 G' @" A |& V$ ]# Q return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
7 w8 Y8 n% g* C+ h
! V2 E. m# |2 U. f8 s* @! @MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect/ ^0 \ g( M' A M, C
' Z' x6 J( {# b) \" }% Q |
zan
|