python远程操作linux文件zip上传及命令操作
模块
paramiko模块、zipfile模块
paramiko模块
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。
pip install paramiko
使用
paramiko
设置ssh连接的远程主机地址和端口
t=paramiko.Transport((ip,port))
#设置登录名和密码
t.connect(username=username,password=password)
#连接成功后打开一个channel
chan=t.open_session()
#设置会话超时时间
chan.settimeout(session_timeout)
#打开远程的terminal
chan.get_pty()
#激活terminal
chan.invoke_shell()
然后就可以通过chan.send('command')和chan.recv(recv_buffer)来远程执行命令以及本地获取反馈。
#coding:utf-8 import paramiko #创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='192.168.2.103', port=22, username='root', password='123456') # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 获取命令结果 result = stdout.read() print (str(result,encoding='utf-8')) # 关闭连接 ssh.close()
详细内容请看文档:https://www.cnblogs.com/qianyuliang/p/6433250.html
zipfile模块
zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的
ZipFile.write(filename[, arcname[, compress_type]])
将指定文件添加到zip文档中。filename为文件路径,arcname为添加到zip文档之后保存的名称, 参数compress_type表示压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。下面的例子演示了如何创建一个zip文档,并将文件D:/test.doc添加到压缩文档中。
import zipfile, os zipFile = zipfile.ZipFile(r'D:/test.zip'), 'w') zipFile.write(r'D:/test.doc', '保存的名字', zipfile.ZIP_DEFLATED) zipFile.close()
详细内容查看文档:https://www.cnblogs.com/gufengchen/p/10956009.html
实例操作
通过压缩本地文件目录成.zip格式,上传至linux服务器指定目录/data下并解压
以自己本地电脑win10+虚拟机Centos7为例
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import os import zipfile import paramiko username = 'root' password = '123456' ssh = paramiko.SSHClient() # 创建SSH对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机 transport = paramiko.Transport(('192.168.239.128', 22)) transport.connect(username=username, password=password) # 连接服务器 def get_src_path(fileName): return os.path.join(os.path.dirname(os.path.dirname(__file__)), '{}.zip'.format(fileName)) def zip_file(fileName): src_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), '{}'.format(fileName)) zip_name = src_dir + '.zip' z = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) for dirpath, dirnames, filenames in os.walk(src_dir): fpath = dirpath.replace(src_dir, '') fpath = fpath and fpath + os.sep or '' for filename in filenames: z.write(os.path.join(dirpath, filename), fpath + filename) print('==压缩成功==') z.close() def upload(fileName, dsc_path): sftp = paramiko.SFTPClient.from_transport(transport) dsc = dsc_path + '/' + '{}.zip'.format(fileName) print('dsc:', dsc) try: sftp.put(get_src_path(fileName), dsc) print('上传成功') except Exception as e: print(e) ssh.close() def unzip(fileName, dsc_path): ssh._transport = transport dsc = dsc_path + '/' + '{}.zip'.format(fileName) stdin, stdout, stderr = ssh.exec_command('rm -rf *;unzip -o %s -d %s;rm -rf %s' %(dsc, dsc_path,dsc)) result = stdout.read().decode() if result.strip() != '': print('解压成功') else: print('Error message ' + stderr.read().decode()) ssh.close() if __name__ == '__main__': zip_file('logs') upload('logs', '/data') unzip('logs', '/data')