sshtunnel和paramiko

     研究这个的起因: 需要在本地用脚本连接线上数据库,线上库与本地网络存在网络隔离,需要使用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()

 

转载于:https://my.oschina.net/justfairytale/blog/784167

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值