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

    1. 介绍:

    paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来实现。
    安装: python3.6 -m pip install paramiko

    2. 使用:

    SSHClient

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

    基于用户名密码连接:

    #!/usr/bin/env python3
    # _*_ coding:utf-8 _*_
    import paramiko
    ip,port = '10.0.3.60','22'
    username,password = 'lishichao','123
    
    # 创建ssh对象
    ssh = paramiko.SSHClient()
    # 解决ssh第一次连接,认证问题
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(ip,port,username,password)
    
    # 执行命令
    stdin,stdout,stderr = ssh.exec_command('hostname')     # stdin 标准输入,  stdout 命令执行的结果, stderr 命令执行错误的结果
    # 获取命令结果 ret
    = stdout.read() if ret: print(ret.decode('utf-8').strip()) else: print("命令执行失败") print(stderr.read().decode('utf-8').strip()) # 关闭连接 ssh.close() # 执行结果: b'docker-server ' # byte 类型,需要decode转码

    基于公钥密钥连接:

    #创建秘钥对
    ssh-keygen
    # 推送到指定服务器
    ssh-copy-id -i .ssh/id_rsa.pub  用户名字@192.168.x.xxx
    前提: 分配公钥
    import paramiko
    
    # 秘钥文件
    private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器 ssh.connect(hostname
    ='10.0.3.56', port=22, username='root', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果 result
    = stdout.read() print(result.decode('utf-8'))
    # 关闭连接 ssh.close()

    出现警告:CryptographyDeprecationWarning

    /usr/local/lib/python3.6/site-packages/paramiko/kex_ecdh_nist.py:39: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
      m.add_string(self.Q_C.public_numbers().encode_point())
    /usr/local/lib/python3.6/site-packages/paramiko/kex_ecdh_nist.py:96: CryptographyDeprecationWarning: Support for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_point
      self.curve, Q_S_bytes
    /usr/local/lib/python3.6/site-packages/paramiko/kex_ecdh_nist.py:111: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
      hm.add_string(self.Q_C.public_numbers().encode_point())
    警告信息
    原因:
    paramiko 2.4.2 依赖 cryptography,而最新的cryptography==2.5里有一些弃用的API。
    
    解决:
    删掉cryptography 2.5,安装2.4.2,就不会报错了。
    python3 -m pip uninstall cryptography==2.5
    python3 -m pip install cryptography==2.4.2
    解决方法:

     

    SFTPClient

    用于连接远程服务器并执行上传下载

    基于用户名密码上传下载

    import paramiko
    
    transport = paramiko.Transport(('10.0.3.56',22))
    transport.connect(username='root', password='buguniao123!@#')
    
    sftp = paramiko.SFTPClient.from_transport(transport)
    
    # 将/tmp/test.txt 上传至服务器 /data/test.txt
    sftp.put('/tmp/test.txt', '/data/test.txt')
    
    # 将/data/test.txt 下载到本地 /tmp/a.txt
    sftp.get('/data/test.txt', '/tmp/a.txt')
    
    transport.close()

    基于公钥密钥上传下载

    import paramiko
    
    private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
    
    transport = paramiko.Transport(('10.0.3.56', 22))
    transport.connect(username='root', pkey=private_key)
    
    sftp = paramiko.SFTPClient.from_transport(transport)
    
    # 将/tmp/haha.txt 上传至服务器 /tmp/a.txt
    sftp.put('/tmp/haha.txt', '/tmp/a.txt')
    
    # 将/tmp/a.txt 下载到本地 /root/a.txt
    sftp.get('/tmp/a.txt', '/root/a.txt')
    
    transport.close()
  • 相关阅读:
    BZOJ 3218: a + b Problem
    P4542 [ZJOI2011]营救皮卡丘
    P4843 清理雪道
    P4553 80人环游世界
    P4126 [AHOI2009]最小割
    P2619 [国家集训队2]Tree I
    P2469 [SDOI2010]星际竞速
    P2050 [NOI2012]美食节
    易语言入门
    jdbc连接oracle语法
  • 原文地址:https://www.cnblogs.com/root0/p/10583074.html
Copyright © 2011-2022 走看看