zoukankan      html  css  js  c++  java
  • paramiko上传下载


    一、paramiko 上传下载
    • 案例:
      • 实现一个链接中,执行N个命令和N个传输
    • 注意问题:
        • 传输通道是基于已经建立链接的chan上创建的
        • 真正的建立链接,只有transport.connect(username=user, passwd=password) 这一句,需要独立存放在方法中
        • 因此,其他的创建对象什么的,为了避免重复创建,可以写在__init__() 中
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import os
    import sys
    import paramiko
    
    root = os.path.dirname(os.path.abspath('__file__'))
    sys.path.append(root)
    
    
    class Myserver:
        def __init__(self, host, port, username='root', passwd='redhat'):
            """
            ssh_obj 放在这里,因为这里只是创建一个对象,没有真正的connect
            """
            self.passwd = passwd
            self.username = username
            self.transport = paramiko.Transport((host, port))
            self.ssh_obj = paramiko.SSHClient()
            self.sec_key = paramiko.RSAKey.from_private_key_file(os.path.join(root, 'id_rsa'))
    
        def create_connect(self, conn_type='passwd'):
            """
            :param conn_type: 默认为密码链接,也可以选择秘钥链接
            """
            if conn_type == 'passwd':
                self.transport.connect(username=self.username, password=self.passwd)
            elif conn_type == 'sec_key':
                self.transport.connect(username=self.username, pkey=self.sec_key)
            else:
                print('type error')
    
        def close_connect(self):
            self.transport.close()
    
        def exec_shell(self, command):
            self.ssh_obj._transport = self.transport
            stdin, stdout, stderr = self.ssh_obj.exec_command(command)
            data = stdout.read().decode()
            if not data:
                data = stderr.read().decode()
            print(data)
            return data
    
        def trans_file(self, src_file, dst_file):
            """ 源码解释说,从一个打开的chan中创建一个传输通道,即首先该通道要先连接 """
            sftp = paramiko.SFTPClient.from_transport(self.transport) # 只是单纯的从已经建立的链接中获取一个传输通道
            sftp.put(src_file, dst_file)
    
    
    def main():
        server_obj = Myserver('192.168.10.202', 22)
        server_obj.create_connect()
        server_obj.exec_shell('hostname')
        server_obj.trans_file('s1.py', '/root/qiaogy2.py')
        server_obj.close_connect()
    
    
    if __name__ == '__main__':
        main()
    








  • 相关阅读:
    大小端判断
    引用计数
    STL_ALGORITHM_H
    书单一览
    GIT版本控制系统(二)
    JS随机数生成算法
    STL学习笔记--临时对象的产生与运用
    乱序优化与GCC的bug
    你的灯亮着吗?
    交换机和路由器
  • 原文地址:https://www.cnblogs.com/qiaogy/p/6295687.html
Copyright © 2011-2022 走看看