zoukankan      html  css  js  c++  java
  • python 学习分享-paramiko模块

    paramiko模块学习分享

    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。

    首先让我们理清以下几个名词:

    • SSHClient:包装了Channel、Transport、SFTPClient
    • Channel:是一种类Socket,一种安全的SSH传输通道;
    • Transport:是一种加密的会话(但是这样一个对象的Session并未建立),并且创建了一个加密的tunnels,这个tunnels叫做Channel;
    • Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话.

    paramiko 参考http://docs.paramiko.org/en/2.0/index.html

    下载安装

    pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto
    pip3 install pycrypto
    pip3 install paramiko

    具体模块使用

    SSHClient:

    远程连接分为两种:(1)基于用户名密码连接 (2)基于公钥秘钥连接

    通过是用paramiko远程操作,其实本质也分为两种:(1)只用SSHClient (2)自己创建一个transport

    基于用户名密码连接

    import paramiko
     
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器
    ssh.connect(hostname='host', port=22, username='root', password='123')
    # 执行命令   stdout命令结果,stderr错误
    stdin, stdout, stderr = ssh.exec_command('ls')
    # 获取命令结果 
    result = stdout.read()
    # 关闭连接
    ssh.close()

    SSHClient 封装 Transport

    import paramiko
     
    transport = paramiko.Transport(('hostname', 22))
    transport.connect(username='root', password='123')
     
    ssh = paramiko.SSHClient()
    ssh._transport = transport
     
    stdin, stdout, stderr = ssh.exec_command('df')
    print(stdout.read())
     
    transport.close()

    基于公钥秘钥连接

    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='host', port=22, username='root', key=private_key)
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('df')
    # 获取命令结果
    result = stdout.read()
    # 关闭连接
    ssh.close()

    SSHClient 封装Transport

    import paramiko
     
    private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
    transport = paramiko.Transport(('hostname', 22))
    transport.connect(username='wupeiqi', pkey=private_key)
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    stdin, stdout, stderr = ssh.exec_command('df')
    transport.close()

    SFTPClient:

      用于连接远程服务器并进行上传下载功能。

    基于用户名密码上传下载

    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('remove_path', 'local_path')
     
    transport.close()

    基于公钥秘钥上传下载

    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('remove_path', 'local_path')
     
    transport.close()

    Demo: 实现远程命令执行和文件上传

    import paramiko
     
    class SSHConnection(object):
     
        def __init__(self, host='192.168.12.68', port=22, username='locojoy',pwd='123321QQ!'):
            self.host = host
            self.port = port
            self.username = username
            self.pwd = pwd
            self.__k = None
     
        def run(self):
            self.connect()  # 连接远程服务器
            self.upload('db.py','/tmp/1.py')  # 将本地的db.py文件上传到远端服务器的/tmp/目录下并改名为1.py
            self.cmd('df')  # 执行df 命令
            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,local_path,target_path):
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            sftp.put(local_path,target_path)
     
        def cmd(self, command):
            ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            # 执行命令
            stdin, stdout, stderr = ssh.exec_command(command)
            # 获取命令结果
            result = stdout.read()
            print(result)
            return result
     
    obj = SSHConnection()
    obj.run()
  • 相关阅读:
    ActiveMQ (二):JMS
    Java消息队列--ActiveMq 初体验
    利用 UltraEdit 重新排版 XML 结构数据
    Java中的Arrays工具类
    数组的下标与长度
    数组的一维与多维
    MySQL数据库的下载与安装
    MySQL数据库的发展历程
    Java中的数组(Array)
    break与continue关键字
  • 原文地址:https://www.cnblogs.com/laay/p/7416791.html
Copyright © 2011-2022 走看看