Loading

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')

posted @ 2021-04-18 10:21  Binzichen  阅读(710)  评论(0编辑  收藏  举报