- 在线时间
- 514 小时
- 最后登录
- 2023-12-1
- 注册时间
- 2018-7-17
- 听众数
- 15
- 收听数
- 0
- 能力
- 0 分
- 体力
- 40070 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 12732
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1419
- 主题
- 1178
- 精华
- 0
- 分享
- 0
- 好友
- 15
TA的每日心情 | 开心 2023-7-31 10:17 |
---|
签到天数: 198 天 [LV.7]常住居民III
- 自我介绍
- 数学中国浅夏
 |
为了安全起见,很多公司服务器数据库的访问多半是要做限制的,由专门的DBA管理,而且都是做的集群,数据库只能内网访问,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常开发调试造成了很大不便。最近几天在做Python相关项目,有个需求 ,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库,不然的话就要去服务器安装Python环境,运行程序,比较麻烦,翻阅多篇博客文章,决定自己去实现。
6 ~; _" P8 b t% h涉及库:pymssql、sshtunnel
1 z! K' x, S- c* }3 t8 J涉及数据库:SQLSERVER
3 \1 u! l# c9 O' t: L1 q) D2 n; N/ M
场景如下:![]()
' H4 O7 r/ y, i4 e$ h跳板机核心代码 def __get_ssh_connector(self): # 远程连接 Y- U: n+ F- P& S
# 跳板机地址 端口,服务器账号,密码配置' }; s H4 Y' P& v+ W
server = SSHTunnelForwarder(: s7 B; t, j- ~& J# t
(: I0 q) p+ _/ L* b
self.connect_config.get("ssh_host", ‘白名单服务器地址’),; }( P0 X8 u0 V; P+ Q8 D5 X" H# s& W
self.connect_config.get("ssh_port", 22)
' b. n8 n3 h# \1 \/ S! Q2 j ), y$ u, M! Y ]' k+ f- W+ |
ssh_username=self.connect_config.get("ssh_username", ‘白名单服务器账号 ’),+ E, Z; w; p8 y% x+ F- ]
ssh_password=self.connect_config.get("ssh_password", ‘白名单服务器密码 ’),
: ~( R2 s1 J' R # 内网数据库地址和端口# I T* q/ T7 y4 a
remote_bind_address=(self.connect_config.get("dbserver", '目标数据库地址'), self.connect_config.get("ssh_mssql_port", ‘数据库端口’))0 }7 A/ X h+ m1 C7 U
)9 S6 ^# c2 n9 ?! v2 v4 V
server.start()
, o) d3 _2 ~) @9 x1 L \* a+ X return server # 远程主机上的mssql通过ssh连接映射到本地的端口7 g1 K3 K7 u8 C! n& ]
pymssql 连接数据库核心代码
5 F( t' B& g& a6 X) X; r9 t; J def get_mssql_connector(self):
6 @' S1 e( k. T- ^0 | return get_mssql_connector({2 t p) s3 a: U. W9 Z: S
"port": self.server.local_bind_port, #非常重要! X! b% I- u1 x. K' U
"username": ‘目标数据库账号’,
, c7 h+ z# M5 E3 ]: ?+ D "password": ‘目标数据库密码’,+ w, Y. n. b+ q7 c! }
"db": self.connect_config.get('db', ‘目标数据库’)
) P. ], }1 |3 X; k })
- Q3 a; g* U" s1 V+ d
1 B5 L) F2 s! W! ]& J5 Z2 Zdef __get_mssql_connector(database_config):
& B( |6 b. s& h0 z' G; n host = database_config.get('host', '127.0.0.1')% @! B$ E6 d/ I; `" b
port = database_config.get('port', ‘数据库端口’)
+ S$ M- q$ }6 S0 U% M5 H user = database_config.get('username', ‘目标数据库账号’)
2 [, Y" y2 ^- r/ }5 u* W8 ` passwd = database_config.get('password', ‘目标数据库密码’)+ G P& u+ b# }9 D' E
db = database_config.get('db', ‘目标数据库’)9 \- ?& j3 e7 j" t: a. D7 q
return pymssql.connect(host=host, port=port, user=user, password=passwd, database=db, charset="UTF-8")- S' f r# z* w) k" ?4 @
8 A" X3 w. l! m- t }1 {' N0 eMySql 和SQLSERVER方法一样,不一样的地方pymssql.connect改成pymysql.connect6 D. S4 t$ D: i+ F
. D C0 u R- Y i3 q: k |
zan
|