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

    paramiko模块功能

    基于SSH用于连接远程服务器并执行相关操作

    SSHClient类

    用于连接远程服务器并执行基本命令,

    有两种连接方式,一种是基于用户名密码的连接,另一种是基于公钥密钥的连接,两种方式都能封装transport的功能进行连接。

    1、基于用户名密码连接

    1.1、普通连接方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import paramiko
     
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='192.168.136.8', port=22, username='root', password='123456')
     
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('ls')
    # 获取命令结果
    result = stdout.read()
    print result
    # 关闭连接
    ssh.close()

    SSHClient()自己创建t=transport对象,然后用t.connect连接等等操作。

    1.2、手动封装Transport功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import paramiko
     
    transport = paramiko.Transport(('hostname', 22))
    transport.connect(username='root', password='123456')
     
    ssh = paramiko.SSHClient()
    ssh._transport = transport  # SSHClient 封装 Transport
     
    stdin, stdout, stderr = ssh.exec_command('df')
    print stdout.read()
     
    transport.close()

    手动创建transport对象。

    为什么要采用这种方式?因为后面的sftpclient只能用transport方式,为了避免代码重复,都用一种方式。

    2、基于公钥密钥连接:

    2.1、普通连接方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import paramiko
      
    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
      
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='c1.salt.com', port=22, username='root', key=private_key)
      
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
      
    # 关闭连接
    ssh.close()

    2.2、手动封装Transport功能:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import paramiko
     
    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
     
    transport = paramiko.Transport(('hostname', 22))
    transport.connect(username='root', pkey=private_key)
     
    ssh = paramiko.SSHClient()
    ssh._transport = transport
     
    stdin, stdout, stderr = ssh.exec_command('df')
     
    transport.close()
     
    SSHClient 封装 Transport

    SFTPClient类

    用于连接远程服务器并执行上传下载文件,只能用transport封装的模式执行。

    1、基于用户名密码连接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import paramiko
      
    transport = paramiko.Transport(('hostname',22))
    transport.connect(username='root',password='123')
      
    sftp = paramiko.SFTPClient.from_transport(transport)
    # 将location.py 上传至服务器 /tmp/test.py
    sftp.put('/tmp/location.py', '/tmp/test.py')
    # 将remove_path 下载到本地 local_path
    sftp.get('remote_path', 'local_path')
      
    transport.close()

    2、基于公钥密钥连接:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import paramiko
      
    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
      
    transport = paramiko.Transport(('hostname', 22))
    transport.connect(username='root', pkey=private_key )
      
    sftp = paramiko.SFTPClient.from_transport(transport)
    # 将location.py 上传至服务器 /tmp/test.py
    sftp.put('/tmp/location.py', '/tmp/test.py')
    # 将remove_path 下载到本地 local_path
    sftp.get('remote_path', 'local_path')
      
    transport.close()

    模拟haproxy更改配置文件

    实现思路:

    1、本地生成文件 uuid.ha

    2、上传文件至服务器 uuid.ha

    3、ha.cfg    -->    ha.cfg.bak

    4、uuid.ha  -->    ha.cfg

    5、 reload

    传文件用paramiko模块的SFTPClient,命令操作()用paramiko模块的SSHClient,为了避免重复连接,所以都用Transport方式连接。

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import paramiko
    import uuid
    #两个方法都用一个连接,减少连接开销
     
    class Haproxy(object):
        def __init__(self):
            self.host='192.168.136.8'
            self.port=22
            self.username='root'
            self.pwd='123456'
        def create_file(self):
            file_name=str(uuid.uuid4())
            #uuid('9fb01137-e13d-4ea8-b16e-d7861c2b8d9a')==>'9fb01137-e13d-4ea8-b16e-d7861c2b8d9a'
            with open(file_name,'wb')as f:
                f.write('test')
            return file_name
     
        def run(self):
            self.connect()
            self.upload()
            self.rename()
            self.close()
     
        def connect(self):
            transport=paramiko.Transport((self.host,self.port))
            transport.connect(username=self.username,password=self.pwd)
            self.__transport=transport
     
        def close(self):
            self.__transport.close()
     
        def upload(self):
            file_name=self.create_file()
            sftp=paramiko.SFTPClient.from_transport(self.__transport)
            sftp.put(file_name,'/tmp/ttt.py')
     
        def rename(self):
            ssh = paramiko.SSHClient()
            ssh._transport=self.__transport
            stdin,stdout,stderro=ssh.exec_command('mv /tmp/ttt.py /tmp/nnn.py')
            result=stdout.read()
            print result
     
    obj=Haproxy()
    obj.run()





















  • 相关阅读:
    numpy-tutorial
    Pandas 数据分析资料
    python3 创建虚拟环境
    机器学习中的评价指标--02
    机器学习中的评价指标--01
    pytest 测试框架
    Ubuntu 添加删除用户
    VSCODE 设置护眼颜色
    信息熵、交叉熵、KL散度等等
    深度学习优化方法演变和公式理解
  • 原文地址:https://www.cnblogs.com/daliangtou/p/5129264.html
Copyright © 2011-2022 走看看