赞
踩
目录
SSh隧道,就是当本地机器因为网络限制无法直接连接目标机器时,可以先在本地机器上,用ssh协议登录一台跳板机,然后本地机器可以通过跳板机链接目标机器。
本地机器和跳板机之间的这个链接,就是SSH隧道。
在Python 中可以使用 sshtunnel 包创建 SSH 隧道,演示代码如下:
- from sshtunnel import SSHTunnelForwarder
-
- def get_ssh_tunnel():
- server = SSHTunnelForwarder(
- ssh_address_or_host=('192.168.1.2', 22),
- ssh_username='username',
- ssh_password='ssh-password',
- remote_bind_address=('10.16.3.3', 3306),
- local_bind_address=('0.0.0.0', 3306)
- )
- server.start()
-
- return server
参数含义:
上面是使用了账户和密码登录跳板机建立的隧道,但是使用密码明文有密码泄露的风险,其实 sshtunnel 还可以使用密钥进行登录,只需要把 ssh_password 参数去掉,换成 ssh_pkey 即可,代码如下:
- from sshtunnel import SSHTunnelForwarder
-
- def get_ssh_tunnel():
- server = SSHTunnelForwarder(
- ssh_address_or_host=('192.168.1.2', 22),
- ssh_username='username',
- ssh_pkey="/var/ssh/id_rsa", # 密钥文件的路径
- remote_bind_address=('10.16.3.3', 3306),
- local_bind_address=('0.0.0.0', 3306)
- )
- server.start()
-
- return server
其中 /var/ssh/id_rsa 就是密钥文件的路径。
想要使用密钥的方法创建 SSH 隧道,需要先把公钥 id_rsa.pub 的内容添加到跳板机的 ~/.ssh/authorized_keys 中才可以。
创建完了隧道之后,就可以连接目标机器了。这里使用的例子是连接目标机器上的 mysql 数据库。
- from sshtunnel import SSHTunnelForwarder
-
- def get_ssh_tunnel():
- server = SSHTunnelForwarder(
- ssh_address_or_host=('192.168.1.2', 22),
- ssh_username='username',
- ssh_password='ssh-password',
- remote_bind_address=('10.16.3.3', 3306),
- local_bind_address=('0.0.0.0', 3306)
- )
- server.start()
-
- return server
-
- import MySQLdb
-
- def get_db_conn(sshserver):
- dbip = sshserver.local_bind_host
- dbport = sshserver.local_bind_port
- db = MySQLdb.connect(
- host=dbip,
- port=dbport,
- user='db-username',
- passwd='db-password',
- db='db-name',
- charset='utf8')
-
- return db
-
- if "__main__" == __name__:
- sshserver = get_ssh_tunnel()
- db = get_db_conn(sshserver)
- cursor = db.cursor()
- cursor.execute("SELECT VERSION()")
- data = cursor.fetchone()
- print("DB version : {0}".format(data))
- db.close()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。