- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40030 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12720
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
' J0 P8 z2 i, v8 }" V& l5 `涉及库:pymssql、sshtunnel
8 d# r# f) S5 D- I6 ~涉及数据库:SQLSERVER- X# K- m# r! @% e
- j, g# I5 q! o6 `
场景如下: : i! l7 f+ X1 k; k) x; F& b1 }
跳板机核心代码 def __get_ssh_connector(self): # 远程连接1 }2 d9 k' a6 u4 y7 B, I- a0 h
# 跳板机地址 端口,服务器账号,密码配置
! y0 _+ m0 T; |- m server = SSHTunnelForwarder(
% i' n4 t' c: K- `! `" a (7 Q) i# T2 w Y/ g
self.connect_config.get("ssh_host", ‘白名单服务器地址’),% x" o; J0 ~; V; R' F
self.connect_config.get("ssh_port", 22)5 v: E$ e T0 @# [ m( \5 f
),5 ]8 P5 ^$ K q2 t7 \
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),
2 P! x6 L% q1 M9 u! K5 V7 s1 j! M5 v ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
: R( r# I9 s: {3 _ # 内网数据库地址和端口* T P& m. ^& G. g
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’)). z/ g, t/ M) O8 f a
)
& l/ t+ h( L) I server.start()
& y4 N3 E' @1 x; |8 G! R return server # 远程主机上的mssql通过ssh连接映射到本地的端口
2 Y) v: T2 [/ T3 p$ h$ epymssql 连接数据库核心代码
+ L! o+ v t, R- Q, q" m/ q* P; n def get_mssql_connector(self):
- H4 c( U' {, h( o6 X return get_mssql_connector({
8 {+ l! ]3 c' d- P "port": self.server.local_bind_port, #非常重要
8 w% \' _* g- |4 U; }; a/ ^ "username": ‘目标数据库账号’,) f3 l- U L- O* ~$ F5 C
"password": ‘目标数据库密码’,
( h/ S7 L9 }: @; e2 l) F "db": self.connect_config.get('db', ‘目标数据库’)
3 @1 v8 ?" [! N) m) D })
9 |3 L3 G1 b( m5 \- u4 ^$ n5 I1 p# I; ~1 S6 e5 c5 l3 e
def __get_mssql_connector(database_config):
, a5 Z- w+ o3 X8 `# d host = database_config.get('host', '127.0.0.1')
2 g }9 I6 w4 {% T* D7 T8 G! L port = database_config.get('port', ‘数据库端口’)
: j. @7 W7 t, w) M3 l! E3 f user = database_config.get('username', ‘目标数据库账号’)- ?4 `. W4 }% K
passwd = database_config.get('password', ‘目标数据库密码’)
, D _5 e) A* V+ V8 E; o& r$ e db = database_config.get('db', ‘目标数据库’)0 H" ~ i9 {+ _
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")
/ ^; ^2 C X7 H1 w, y" M2 k( Q. c+ s+ V5 x* n
MySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect
# j1 [( I; t8 z2 i; b9 z; X2 R( ]/ m2 F. b( C; }/ r
|
zan
|