当前位置:   article > 正文

Python:使用SSH隧道链接数据库_用python和ssh隧道连接数据库

用python和ssh隧道连接数据库

目录

 

一、SSH隧道

二、使用 sshtunnel 包建立隧道

2.1)使用账户、密码登录建立隧道

2.2)使用密钥文件代替密码

三、通过SSH隧道链接数据库


一、SSH隧道

SSh隧道,就是当本地机器因为网络限制无法直接连接目标机器时,可以先在本地机器上,用ssh协议登录一台跳板机,然后本地机器可以通过跳板机链接目标机器。

本地机器和跳板机之间的这个链接,就是SSH隧道。

二、使用 sshtunnel 包建立隧道

2.1)使用账户、密码登录建立隧道

在Python 中可以使用 sshtunnel 包创建 SSH 隧道,演示代码如下:

  1. from sshtunnel import SSHTunnelForwarder
  2. def get_ssh_tunnel():
  3. server = SSHTunnelForwarder(
  4. ssh_address_or_host=('192.168.1.2', 22),
  5. ssh_username='username',
  6. ssh_password='ssh-password',
  7. remote_bind_address=('10.16.3.3', 3306),
  8. local_bind_address=('0.0.0.0', 3306)
  9. )
  10. server.start()
  11. return server

参数含义:

  • ssh_address_or_host : 跳板机的 IP 和 Port
  • ssh_username : 登录跳板机时使用的账户名称
  • ssh_password : 登录跳板机时使用的密码
  • remote_bind_address : 本地机器要访问的目标机器的IP(如果目标机器就是跳板机自己,则是 127.0.0.1)和 Port
  • local_bind_address : SSH 隧道监听的本地机器的 IP(可以是 0.0.0.0 监听所有IP,也可以选择指定的网口) 和 Port

2.2)使用密钥文件代替密码

上面是使用了账户和密码登录跳板机建立的隧道,但是使用密码明文有密码泄露的风险,其实 sshtunnel 还可以使用密钥进行登录,只需要把 ssh_password 参数去掉,换成 ssh_pkey 即可,代码如下:

  1. from sshtunnel import SSHTunnelForwarder
  2. def get_ssh_tunnel():
  3. server = SSHTunnelForwarder(
  4. ssh_address_or_host=('192.168.1.2', 22),
  5. ssh_username='username',
  6. ssh_pkey="/var/ssh/id_rsa", # 密钥文件的路径
  7. remote_bind_address=('10.16.3.3', 3306),
  8. local_bind_address=('0.0.0.0', 3306)
  9. )
  10. server.start()
  11. return server

其中 /var/ssh/id_rsa 就是密钥文件的路径。

想要使用密钥的方法创建 SSH 隧道,需要先把公钥 id_rsa.pub 的内容添加到跳板机的 ~/.ssh/authorized_keys 中才可以。

三、通过SSH隧道链接数据库

创建完了隧道之后,就可以连接目标机器了。这里使用的例子是连接目标机器上的 mysql 数据库。

  • 跳板机IP : 192.168.1.2
  • mysql数据库IP : 10.16.3.3
  1. from sshtunnel import SSHTunnelForwarder
  2. def get_ssh_tunnel():
  3. server = SSHTunnelForwarder(
  4. ssh_address_or_host=('192.168.1.2', 22),
  5. ssh_username='username',
  6. ssh_password='ssh-password',
  7. remote_bind_address=('10.16.3.3', 3306),
  8. local_bind_address=('0.0.0.0', 3306)
  9. )
  10. server.start()
  11. return server
  12. import MySQLdb
  13. def get_db_conn(sshserver):
  14. dbip = sshserver.local_bind_host
  15. dbport = sshserver.local_bind_port
  16. db = MySQLdb.connect(
  17. host=dbip,
  18. port=dbport,
  19. user='db-username',
  20. passwd='db-password',
  21. db='db-name',
  22. charset='utf8')
  23. return db
  24. if "__main__" == __name__:
  25. sshserver = get_ssh_tunnel()
  26. db = get_db_conn(sshserver)
  27. cursor = db.cursor()
  28. cursor.execute("SELECT VERSION()")
  29. data = cursor.fetchone()
  30. print("DB version : {0}".format(data))
  31. db.close()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/222319
推荐阅读
相关标签
  

闽ICP备14008679号