import pymongo
from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
ssh_address_or_host=('1.1.1.1', 22), # 指定ssh登录的跳板机的address
ssh_username='jimmy', # 跳板机的用户
ssh_pkey=r'D:\lp\id_rsa_2048', # 跳板机的私钥
ssh_private_key_password='x', # 跳板机的私钥密码
# ssh_password='x', # 跳板机的密码 #是直接用密码登录,不需要私钥的
remote_bind_address=('127.0.0.1', 27017) #从跳板机连到哪
)
server.start()
# 之后连接的时候就ip=127.0.0.1,port=server.local_bind_port固定的。
client = pymongo.MongoClient(host='127.0.0.1', port=server.local_bind_port)
server.close()
参考:http://www.zgljl2012.com/python-shi-yong-pymysqlmo-kuai-tong-guo-sshsui-dao-lian-jie-mysql/
案例:连接host2运行shell命令,需要host1做跳板机。
from sshtunnel import SSHTunnelForwarder
import paramiko
class MysqlModel(object):
__host1__ = '1.1.1.1'
def __init__(self):
super(MysqlModel, self).__init__()
# 建立类方法,初始化对象
@classmethod
def setEnv(cls,env,host2):
if env == 'PRO':
# 需要先建立ssh
cls.server = SSHTunnelForwarder(
ssh_address_or_host=(cls.__host1__, 56000), # 指定ssh登录的跳转机的address
ssh_username='a', # 跳转机的用户
ssh_password='b', # 跳转机的密码
remote_bind_address=(host2, 22))
cls.server.start()
return cls()
elif env == 'DEV':
return cls()
def asdd(self,jobid,tid):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='127.0.0.1', port=self.server.local_bind_port, username='host2的', password='host2的')
cmd = 'grep -E -B 1 ".*{}|.*{}"/logs/*_{}.stderr*'.format(a,b,tid) # 多个命令用;隔开
# print(cmd)
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
if not result:
result = stderr.read()
ssh.close()
print(result.decode())
# def __del__(self):
# print(self.aaa)
# if self.aaa:
# self.server.close()
def main():
host2 = "1.1.1.2"
n = MysqlModel.setEnv("PRO",host2)
n.asdd('1','2')
n.server.close()
if __name__ == '__main__':
main()
# SSHClient 封装 Transport?Transport是什么?paramiko 参考:
# https://www.cnblogs.com/Keep-Ambition/p/8206834.html
# https://www.cnblogs.com/whatisfantasy/p/6138663.html
# 单独执行sh命令的话可参考https://github.com/amoffat/sh