python关于ssh

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值