- 在线时间
- 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环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。3 x6 o: r5 f* S/ ?; F& K
涉及库:pymssql、sshtunnel
$ I# Z* q. Q' M% Q2 [涉及数据库:SQLSERVER
& Y3 f( U8 d: I/ n) O
% L* i, ]' V# q V场景如下:![]()
+ B; _0 S( Z8 g7 g! j, h7 [跳板机核心代码 def __get_ssh_connector(self): # 远程连接 P, s& W/ Z2 t8 _+ m% D
# 跳板机地址 端口,服务器账号,密码配置
3 c5 q ?( g. \1 F server = SSHTunnelForwarder(- X3 a; @% S# e# D! Z Z5 J, B4 ^6 ]7 T
(
9 C3 j2 M7 s7 H9 O: e/ s/ D self.connect_config.get("ssh_host", ‘白名单服务器地址’),
" Y* J0 J* u7 [ self.connect_config.get("ssh_port", 22)4 f- D- u% O5 R! C( o
),/ i3 z/ l0 d& s) e4 K" o
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
! K1 W7 ]. ^1 C: y- d. {& Z3 @/ g9 n ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),5 c5 @) x( b* T" g8 [3 D
# 内网数据库地址和端口
* G n& `, m3 O+ |0 M9 E( b3 ~ remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
- L' u ~; K& n2 B: _/ a )
* `, C5 | f3 y0 A5 d% e server.start()
+ b5 v/ k/ N8 t# y: N return server # 远程主机上的mssql通过ssh连接映射到本地的端口0 a( @, g! p5 s; g: r9 I8 w4 J3 R
pymssql 连接数据库核心代码
' f) t$ _+ r# S: Y, X2 k6 L$ T def get_mssql_connector(self):# J; w# x$ F$ E# d% h, {1 L `
return get_mssql_connector({
- j3 f+ z8 j& Y0 e "port": self.server.local_bind_port, #非常重要; c4 }( h* r+ `6 x" c5 q5 r" y
"username": ‘目标数据库账号’,/ B j: J: Z7 ^7 T i3 @$ L# r; W
"password": ‘目标数据库密码’,
9 F: ]3 b9 N3 q0 l R* c "db": self.connect_config.get('db', ‘目标数据库’)
P5 L& U2 j: k1 D5 S })
s( M3 ]+ w: R" N6 u+ L, b* o( C2 y; r: q2 ^, b( g1 D! c1 G0 s9 u
def __get_mssql_connector(database_config):
4 C+ ~4 b E3 v* d) _ host = database_config.get('host', '127.0.0.1')
5 K& ]* l* A- j( E port = database_config.get('port', ‘数据库端口’)
4 b5 o& A3 ?1 q+ Q user = database_config.get('username', ‘目标数据库账号’)7 ^ h* k: |' {: C, J# |6 l9 c* U- x
passwd = database_config.get('password', ‘目标数据库密码’)
, c5 s i s; F" Z" H. }0 g db = database_config.get('db', ‘目标数据库’)+ M5 U( J+ D- l1 `+ Q+ \
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8"); F+ C1 o3 G: p5 I
; Q7 ]. _) v- g; ?# W" B5 s+ p; {5 T
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
* X% s( f4 J5 X3 ^- j( t) Y4 b- S0 q- u5 D) u& t
|
zan
|