一、paramiko 上传下载
- 案例:
- 实现一个链接中,执行N个命令和N个传输
- 注意问题:
-
- 传输通道是基于已经建立链接的chan上创建的
- 真正的建立链接,只有transport.connect(username=user, passwd=password) 这一句,需要独立存放在方法中
- 因此,其他的创建对象什么的,为了避免重复创建,可以写在__init__() 中
-
#!/usr/bin/env python# -*- coding:utf-8 -*-import osimport sysimport paramikoroot = 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()