- 在线时间
- 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
( Y1 Y: e+ n$ c3 p涉及库:pymssql、sshtunnel
; u4 e5 t: c \- P$ j/ W" Y涉及数据库:SQLSERVER9 N2 l% _* ]. ]9 i( K+ Z, v% g
0 j- g& x8 t, g场景如下: : Q( F' F8 N7 D4 @- ?) D
跳板机核心代码 def __get_ssh_connector(self): # 远程连接
( X/ V. g1 X$ z' B6 h; O& W3 I # 跳板机地址 端口,服务器账号,密码配置& ?9 u6 |. m. a% m
server = SSHTunnelForwarder(
~: e( V% _ H" T( a( S (
8 _. z! d+ t; h$ U0 x self.connect_config.get("ssh_host", ‘白名单服务器地址’),
+ U$ D. z- _) ^' n* u% L self.connect_config.get("ssh_port", 22)
* D P q- U3 Y/ m% y4 h ),2 i* [: s$ B; c* C: c/ v
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
2 x4 v- b8 x& P$ h6 g ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
, a# v* y W1 H x # 内网数据库地址和端口
$ d/ a; a: A* }+ o1 A, K& g remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’)); u$ M) e$ N* s8 Z: C
)
8 { N4 E; c: B* I- V server.start()* a) s" [+ M+ x O
return server # 远程主机上的mssql通过ssh连接映射到本地的端口6 i. q! V. C- E4 b* y \: r+ ]9 `
pymssql 连接数据库核心代码
) X! ~; o* k ^" ?$ X1 C def get_mssql_connector(self):. E0 n! l. j& L# O6 m$ O
return get_mssql_connector({
5 r* b4 W* b b* ?0 p; Z "port": self.server.local_bind_port, #非常重要
% [! L. } ]( `( b2 ~+ z" W "username": ‘目标数据库账号’,
5 ]" P L2 b# b. r "password": ‘目标数据库密码’,
% B$ r T3 L/ ` "db": self.connect_config.get('db', ‘目标数据库’)* @* i8 B" g/ g: Q2 g
})
% o0 m, a) r Z
& ^3 O+ q1 u; b, Udef __get_mssql_connector(database_config):
6 D. U( o$ p/ I5 `; T6 O* B7 Z host = database_config.get('host', '127.0.0.1')
' o* u( p$ {! P, Y u port = database_config.get('port', ‘数据库端口’)# j* _0 D j4 m
user = database_config.get('username', ‘目标数据库账号’)* b8 l/ U1 x2 m4 O$ `6 N$ \
passwd = database_config.get('password', ‘目标数据库密码’)0 Q/ G, w T* B) P' z# C" n# u
db = database_config.get('db', ‘目标数据库’)8 G. A9 t8 `3 \8 z6 u; K
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
1 }( T* f1 l5 G+ d7 T8 D- K' e3 r# U) a: _5 w, \
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
$ m/ G: M. Y& p1 K8 g7 y6 ]9 U+ j' [+ U4 d& |/ S! H7 K
|
zan
|