zoukankan      html  css  js  c++  java
  • python模块-paramiko

    paramiko

    COPY FROM https://blog.csdn.net/forever_wen/article/details/82556154

    paramiko 是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一
    • 安装
      由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
      yum -y install python-devel
      pip3 install pycrypto
      pip3 install paramiko

    • 代码案例

    1. 远程连接
    import paramiko
    
    ##1.创建一个ssh对象
    client = paramiko.SSHClient()
    
    #2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
    ##自动选择yes
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    #3.连接服务器
    client.connect(hostname='172.25.254.31',
                   port=22,
                   username='root',
                   password='westos')
    
    #4.执行操作
    stdin,stdout, stderr = client.exec_command('hostname')
    
    #5.获取命令执行的结果
    result=stdout.read().decode('utf-8')
    print(result)
    
    #6.关闭连接
    client.close()
    
    1. 使用sftp上传文件
    import paramiko
    #获取Transport实例
    tran = paramiko.Transport("172.25.254.31",22)
    #连接SSH服务端
    tran.connect(username = "root", password = "westos")
    #获取SFTP实例
    sftp = paramiko.SFTPClient.from_transport(tran)
    #设置上传的本地/远程文件路径
    localpath="passwd.html"   ##本地文件路径
    remotepath="/home/kiosk/Desktop/fish"   ##上传对象保存的文件路径
    #执行上传动作
    sftp.put(localpath,remotepath)
    
    tran.close()
    
    1. 使用sftps远程读取Linux服务器上的文件方法
    import paramiko
     
    #服务器信息,主机名(IP地址)、端口号、用户名及密码
    hostname = ""
    port = 22
    username = ""
    password = ""
     
     
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname, port, username, password, compress=True)
    sftp_client = client.open_sftp()
    remote_file = sftp_client.open("/home/...txt")#文件路径
    try:
      for line in remote_file:
        print(line)
    finally:
      remote_file.close()
    
    
    1. 使用sftp下载文件
    import paramiko
    
    #获取SSHClient实例
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #连接SSH服务端
    client.connect("172.25.254.31",username="root",password="westos")
    #获取Transport实例
    tran = client.get_transport()
    #获取SFTP实例
    sftp = paramiko.SFTPClient.from_transport(tran)
    
    remotepath='/home/kiosk/Desktop/fish'
    localpath='/home/kiosk/Desktop/fish'
    
    sftp.get(remotepath, localpath)
    
    client.close()
    
    1. 批量远程密码连接
    from paramiko.ssh_exception import NoValidConnectionsError
    from paramiko.ssh_exception import AuthenticationException
    
    
    def connect(cmd,hostname,port=22,username='root',passwd='westos'):
        import paramiko
    
        ##1.创建一个ssh对象
        client = paramiko.SSHClient()
    
        #2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
        ##自动选择yes
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
        #3.连接服务器
        try:
            client.connect(hostname=hostname,
                           port=port,
                           username=username,
                           password=passwd)
            print('正在连接主机%s......'%(hostname))
        except NoValidConnectionsError as e:   ###用户不存在时的报错
            print("连接失败")
        except AuthenticationException as t:   ##密码错误的报错
            print('密码错误')
    
        else:
            #4.执行操作
            stdin,stdout, stderr = client.exec_command(cmd)
    
            #5.获取命令执行的结果
            result=stdout.read().decode('utf-8')
            print(result)
    
            #6.关闭连接
        finally:
            client.close()
    
    with open('ip.txt') as f:  #ip.txt为本地局域网内的一些用户信息
        for line in f:
            line = line.strip()   ##去掉换行符
            hostname,port,username,passwd= line.split(':')
            print(hostname.center(50,'*'))
            connect('uname', hostname, port,username,passwd)
    
    1. paramiko基于公钥密钥连接
    import  paramiko
    
    from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException
    
    
    def connect(cmd, hostname, port=22, user='root'):
    
        client = paramiko.SSHClient()  
    
        private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
         ###id_rsa为本地局域网密钥文件
    
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            client.connect(hostname=hostname,
                           port=port,
                           username=user,
                           pkey=private_key
                          )
    
            stdin, stdout, stderr = client.exec_command(cmd)
        except NoValidConnectionsError as e:
            print("连接失败")
        except AuthenticationException as e:
            print("密码错误")
        else:
    
            result = stdout.read().decode('utf-8')
            print(result)
        finally:
    
            client.close()
    for count in range(254):
        host = '172.25.254.%s' %(count+1)
        print(host.center(50, '*'))
        connect('uname', host)
    
    1. 基于密钥的上传和下载
    import paramiko
    private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
    tran = paramiko.Transport('172.25.254.31',22)
    tran.connect(username='root',password='westos')
    #获取SFTP实例
    sftp = paramiko.SFTPClient.from_transport(tran)
    remotepath='/home/kiosk/Desktop/fish8'
    localpath='/home/kiosk/Desktop/fish1'
    sftp.put(localpath,remotepath)
    sftp.get(remotepath, localpath)
    
    1. paramiko的再封装
    import os
    import paramiko
    from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException, SSHException
    
    
    class SshRemoteHost(object):
        def __init__(self, hostname, port, user, passwd, cmd):
            self.hostname  = hostname
            self.port = port
            self.user = user
            self.passwd = passwd
            self.cmd = cmd
        def run(self):
            """默认调用的内容"""
            # cmd hostname
            # put
            # get
            cmd_str =  self.cmd.split()[0] # cmd
            # 类的反射,判断类里面是否可以支持该操作
            if hasattr(self, 'do_'+ cmd_str):  # do_cmd
                getattr(self, 'do_'+cmd_str)()
            else:
                print("目前不支持该功能")
    
        def do_cmd(self):
            client = paramiko.SSHClient()
    
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
            try:
    
                client.connect(hostname=self.hostname,
                               port=self.port,
                               username=self.user,
                               password=self.passwd)
    
                print("正在连接%s......." % (self.hostname))
            except NoValidConnectionsError as e:
                print("连接失败")
            except AuthenticationException as e:
                print("密码错误")
            else:
                # 4. 执行操作
                cmd = ''.join(self.cmd.split()[1:])  ##将输入的后面的取出,作为
                stdin, stdout, stderr = client.exec_command(cmd)
    
                # 5.获取命令执行的结果
                result = stdout.read().decode('utf-8')
                print(result)
            finally:
                # 6.关闭连接
                client.close()
    
        def do_put(self):
            ###put /tmp/passwd  ###将本地的/tmp/passwd上传到远端/tmp/passwd
            print('正在上传...')
            try:
                #获取Transport实例
                tran = paramiko.Transport(self.hostname,int(self.port))  ##由于端口为整形,而我们用split方法得到的是str
                #连接SSH服务端
                tran.connect(username = self.user, password = self.passwd)
            except SSHException as e:
                print('连接失败')
            else:
                #获取SFTP实例
                sftp = paramiko.SFTPClient.from_transport(tran)
                newCmd = self.cmd.split()[1:]
                if len(newCmd) == 2:
    
                    #设置上传的本地/远程文件路径
                    localpath=newCmd[0]
                    remotepath=newCmd[1]
                    #执行上传动作
                    sftp.put(localpath,remotepath)
                    print('%s文件上传到%s主机的%s文件成功' %(localpath,self.hostname,remotepath))
                else:
                    print('上传文件信息错误')
    
                    tran.close()
    
    
        def do_get(self):
    
            print('正在下载...')
            try:
                # 获取Transport实例
                tran = paramiko.Transport(self.hostname, int(self.port))  ##由于端口为整形,而我们用split方法得到的是str
                # 连接SSH服务端
                tran.connect(username=self.user, password=self.passwd)
            except SSHException as e:
                print('连接失败')
            else:
                # 获取SFTP实例
                sftp = paramiko.SFTPClient.from_transport(tran)
                newCmd = self.cmd.split()[1:]
                if len(newCmd) == 2:
    
                    # 设置下载的本地/远程文件路径
                    localpath = newCmd[1]
                    remotepath = newCmd[0]
                    # 执行上传动作
                    sftp.get( remotepath,localpath)
                    print('%s主机的%s文件下载到%s文件成功' % (self.hostname,remotepath,localpath))
                else:
                    print('上传文件信息错误')
    
                    tran.close()
    
    
    import paramiko
    import os
    # 1.选择操作的主机组:eg:mysql,web,ftp
    groups=[file.rstrip('.conf') for  file in os.listdir('conf')]
    print("主机组显示:".center(50,'*'))
    for group in groups:
        print('	',group)
    choiceGroup = input("选择批量操作的主机组(eg:mysql):")
    
    
    ##2.根据选择的主机组,显示包含的主机IP/主机名
    # 1).打开文件conf/choiceGroup.conf
    # 2).依次读取文件每一行
    # 3).只拿出
    print("主机组包含的主机:".center(50,'*'))
    with open('conf/%s.conf' %(choiceGroup)) as f:
        for line in f:
            print(line.split(':')[0])
        f.seek(0,0)  ##把指针移动到文件最开始
        hostinfos = [line.strip() for line in f.readlines()]
    
    ###3.让用户确认信息,选择需要批量执行的命令;
    ##      -cmd shell 命令
    ##      -put 本地文件  远程文件
    ##      -get 远程文件  本地文件
    print("批量执行脚本".center(50,"*"))
    while True:
        cmd = input('>>:').strip()
        if cmd :
            if cmd == 'exit' or cmd == "quit":
                print("执行完毕,正在退出")
                break
            for info in hostinfos:
                host,port,user,passwd = info.split(':')
                clientObj = SshRemoteHost(host,port,user,passwd,cmd)
                clientObj.run()
    
  • 相关阅读:
    Effective Java 的笔记(二)
    设计模式系列 装饰模式
    一道多线程题目的解决方案
    Effective Java 的笔记(一)
    Java 并发编程实践
    【转】微博技术底层架构的实现
    Head First JavaScript 笔记
    JVM 学习笔记 类的加载和执行
    背包问题
    Oracle 序列号通过定时任务重置
  • 原文地址:https://www.cnblogs.com/Young-shi/p/15378719.html
Copyright © 2011-2022 走看看