一、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()