- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40216 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12776
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
|---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
: ]- s' D1 M: K2 ~8 A# O; L( {* {涉及库:pymssql、sshtunnel- t" V2 T! _6 t
涉及数据库:SQLSERVER
' d5 l! z; C1 c7 A" f' e/ y9 g0 M/ }& P% x( |
场景如下: . ]) O) i2 q9 C/ j$ g! V$ U& `: g
跳板机核心代码 def __get_ssh_connector(self): # 远程连接# {$ i2 S4 h+ R8 q4 D( t$ ^8 D
# 跳板机地址 端口,服务器账号,密码配置
% i5 r. z) k9 J7 B4 Q: M server = SSHTunnelForwarder(
; \$ L' R6 e! _; ^+ u6 n% `! n# k (
! W8 t( e/ D9 G! |4 b self.connect_config.get("ssh_host", ‘白名单服务器地址’),7 H/ F( D0 ~, q
self.connect_config.get("ssh_port", 22)
$ A4 X' d. x n! j0 Y" Q5 } ),
?4 L7 x4 n) t6 C* B5 A ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),6 G$ z" ^9 k3 @9 U! A
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
; W' i( P* {( W. x2 v # 内网数据库地址和端口9 k2 p! H6 V; T' v# @ R
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))
3 _" U, K( f( k5 _0 U )
7 `9 m$ l: G/ C server.start()/ T( V# c9 z5 S* i( @ i! n
return server # 远程主机上的mssql通过ssh连接映射到本地的端口
j6 u, Q; i) jpymssql 连接数据库核心代码 ) W, ^7 {1 S2 T# @+ J
def get_mssql_connector(self):
9 v8 @* T3 g- L9 y9 R- W+ } \7 }( d return get_mssql_connector({8 O2 s, P" a1 @: o+ i, c# I
"port": self.server.local_bind_port, #非常重要4 R4 x. x& C0 K8 `# p4 ]
"username": ‘目标数据库账号’,
/ w6 [# C D7 {# R! H) [) M3 r) f "password": ‘目标数据库密码’,' Z1 \* j; S: K: t6 y/ Q# L/ _; M# ~
"db": self.connect_config.get('db', ‘目标数据库’)" r. v8 e( h& f
})
! [) Z. b b: J" K% i$ n- w" p0 V% m7 F: L# y% N3 h
def __get_mssql_connector(database_config):- O! W9 \9 j9 T) J
host = database_config.get('host', '127.0.0.1')/ { P% K' M- X: E% k d2 H
port = database_config.get('port', ‘数据库端口’)
, N( z8 B/ m1 G/ L( I) v user = database_config.get('username', ‘目标数据库账号’)
) O* k+ O( M5 A% R4 F6 E# F% L passwd = database_config.get('password', ‘目标数据库密码’)$ V) e; [/ H q; s
db = database_config.get('db', ‘目标数据库’)
7 p3 H$ h/ u5 |- o E; t+ k2 b return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
( d: o1 k# e+ L% N- E' I- U0 B, b, V. l8 u0 B5 F
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect+ l+ V+ o9 w/ V* C
7 g6 h5 N8 Z! ^
|
zan
|