- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40293 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12799
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
4 y* q6 N, v: j' }: Y, Y涉及库:pymssql、sshtunnel8 `9 D$ n/ b4 U% A1 s- ~7 t& G
涉及数据库:SQLSERVER
' P9 q, ?9 u7 _3 Q' Q* D* B, ?( ?& ^( m
场景如下:![]()
6 O0 D% a/ p g$ r6 Y, X跳板机核心代码 def __get_ssh_connector(self): # 远程连接
9 e" ^1 }6 W/ W1 |( p # 跳板机地址 端口,服务器账号,密码配置
/ l7 f# q3 ?/ T7 r6 f server = SSHTunnelForwarder(
' F/ e, e5 O$ T/ p2 ]" h (
b2 q* f3 `4 p; F self.connect_config.get("ssh_host", ‘白名单服务器地址’),2 C6 n8 s4 n5 s5 n! x
self.connect_config.get("ssh_port", 22)
7 I/ u6 { z/ i: W: g0 p+ k3 v ),) n o& V" ]0 J9 V( ?" K+ e8 t
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
. q* F0 k" ^: N1 r9 B& v! g) [: e ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),% x$ o/ Y9 w4 q) U' K
# 内网数据库地址和端口
: M2 H0 [' {& S8 R+ B remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))6 W8 k9 A; u6 [$ [ S( J$ u& Q
)* o, k+ m' J1 ]! d' B
server.start()4 K! M5 ~) x7 F7 M3 \) H! M
return server # 远程主机上的mssql通过ssh连接映射到本地的端口( ]- L$ n! R7 s* g; {4 _
pymssql 连接数据库核心代码 3 |% }- `8 p; s, I x
def get_mssql_connector(self):
! ^5 u* G! u2 y6 J# h' K" C( B* b return get_mssql_connector({4 T: q+ ]- z2 u
"port": self.server.local_bind_port, #非常重要9 m. q7 ?) c$ e1 S" g
"username": ‘目标数据库账号’,; x" G. O7 o5 ?) H, s' w5 _
"password": ‘目标数据库密码’,* T* r# `; d+ Q" [' I
"db": self.connect_config.get('db', ‘目标数据库’): j8 J( @* q6 t- E( S# N9 a6 p9 R
})
' {6 n) F# j% M* _2 C! G) G6 O1 h7 |# Y- k5 T
def __get_mssql_connector(database_config):! B0 w. B( T- p8 J' X
host = database_config.get('host', '127.0.0.1')
. D( s# F) F w port = database_config.get('port', ‘数据库端口’)
: g3 p, R) g% O, Z5 I9 q0 V user = database_config.get('username', ‘目标数据库账号’)
% I6 ?8 A+ E% D5 l5 z& T passwd = database_config.get('password', ‘目标数据库密码’)
3 h0 E& O, q4 d5 D' \ db = database_config.get('db', ‘目标数据库’): v. H* [, S l
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
, Q* t2 Z1 W# {1 P8 [- L/ u: f& n ?) _
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
, i- J3 w$ B* N9 [/ D
! s% g: f# l' ~' P4 \1 J. V |
zan
|