- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40290 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12798
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
6 f" T7 d9 _% E. D; I0 O+ m涉及库:pymssql、sshtunnel
6 c+ _. t) G0 e: q& D涉及数据库:SQLSERVER" R+ u5 H3 `+ C' F7 r" W
- c7 x/ m: B N' @! x$ F* [
场景如下:![]()
4 n4 [2 n- g) F. W跳板机核心代码 def __get_ssh_connector(self): # 远程连接
4 i8 @, m N& n3 _ # 跳板机地址 端口,服务器账号,密码配置6 o' Z W% d* |( b- |& H9 z
server = SSHTunnelForwarder(
! |+ Z y, B. l& J+ ~& o# @ (
' v# O! Z! W% k6 E' p self.connect_config.get("ssh_host", ‘白名单服务器地址’),
- O: o* e, J. O self.connect_config.get("ssh_port", 22)
1 }8 n7 |# e1 X- C0 r5 R ),
! J$ `( r) |- C( Y& {; m. s( {& t ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),# y9 N$ W ?# ]' c5 U* M
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),2 \7 ^9 Y t: g" `, ?# }3 Y
# 内网数据库地址和端口
% x+ j: n/ ~" n0 }! e remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))( y, N; ?3 f- O$ ^! v T
)
0 k k R: X$ w# `3 v7 O server.start()8 T- r' n8 j/ s, s
return server # 远程主机上的mssql通过ssh连接映射到本地的端口
9 j& R/ z7 x( t* tpymssql 连接数据库核心代码
3 T. M# w, @7 j# C9 \: s0 v def get_mssql_connector(self):
; E1 B' b' Z$ e0 h6 n0 | return get_mssql_connector({& r; B) N' `+ q9 B$ q
"port": self.server.local_bind_port, #非常重要
N4 r+ j2 Q& L7 S1 L. h5 D "username": ‘目标数据库账号’,
2 R$ h) Q# Z" [ "password": ‘目标数据库密码’,, e) z3 n( g4 a6 h/ C$ \4 P
"db": self.connect_config.get('db', ‘目标数据库’)9 v7 p5 B: k3 N1 L' H& H
})' M' V/ \; d) N, O5 _2 d
; P5 L% V5 t" L1 u7 w
def __get_mssql_connector(database_config):# F1 T: P% V a# A- Z/ H
host = database_config.get('host', '127.0.0.1')6 b5 `6 B1 c9 W% N0 R {
port = database_config.get('port', ‘数据库端口’)$ s% Z( c6 u- q- ?+ [
user = database_config.get('username', ‘目标数据库账号’) R) ?; r) K0 w* l8 i: q8 L
passwd = database_config.get('password', ‘目标数据库密码’)
" t& k7 V0 E# ?5 Q, z' u/ e% q db = database_config.get('db', ‘目标数据库’). ?1 u4 ?0 F$ X% w" w+ t) J8 e9 Y
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
$ Q3 H% i2 l. t1 d4 z b" \0 z! H: V4 j0 ^' T
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
: O8 [8 J4 C. k8 I" ?5 w
; Z$ J% }. n# k; u2 Z |
zan
|