研究这个的起因: 需要在本地用脚本连接线上数据库,线上库与本地网络存在网络隔离,需要使用ssh隧道访问特定端口才能连接到数据库。于是就在想一些办法去通过访问跳板机,进而访问线上数据库。
在调研过程中,发现sshtunnel模块可以实现我的需求。
安装过程不累述,pip install 就好。mac可能会遇到权限问题,建议制定用户安装(pip install XXXX —user -U),而不是安装到系统上,这样很优雅。
talk is cheap, show code.
import MySQLdb import json import paramiko from sshtunnel import SSHTunnelForwarder import traceback hostname = '' username = '' password = '' port = 22 db_hostname = '' db_username = '' db_password = '' db_port = 3306 db_name = '' server = SSHTunnelForwarder((hostname, port), ssh_password=password, ssh_username=username, remote_bind_address=(db_hostname, db_port)) def query_db(sql): try: server.start() db = MySQLdb.connect(host='127.0.0.1', port=server.local_bind_port, user=db_username, passwd=db_password, db=db_name) cursor = db.cursor() cursor.execute(sql) data = cursor.fetchall() print data db.close() server.close() except: traceback.print_exc() server.close() if __name__=='__main__': sql = "" query_db(sql)
在调研过程中,还发现了paramiko这个模块,很有意思。它可以在本地使用脚本去远程服务器上执行命令。
安装过程同样不累述, demo代码如下:
import paramiko hostname = '' username = '' password = '' port = 22 def connect(): paramiko.util.log_to_file('paramiko.log') s=paramiko.SSHClient() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) s.connect(hostname=hostname, username=username, password=password, port=port) stdin, stdout, stderr=s.exec_command('ls -l') print stdout.read() s.close() if __name__=='__main__': connect()