python指令碼實現向伺服器上傳 zip並解壓

H.U.C.小黑發表於2020-11-04

由於公司沒有運維,前端程式經常需要後端程式設計師部署,為解決部署繁瑣問題,使用python實現上傳zip包並解壓

import os
import sys

import paramiko
from scp import SCPClient


class zip_file_deploy:
    def __init__(self):
        """
        """
        # 建立一個ssh的客戶端,用來連線伺服器
        ssh_client = paramiko.SSHClient()
        # 建立一個ssh的白名單
        know_host = paramiko.AutoAddPolicy()
        # 載入建立的白名單
        ssh_client.set_missing_host_key_policy(know_host)
        # 連線伺服器
        ssh_client.connect(
            hostname=hostname,
            port=port,
            username=username,
            password=password
        )
        self.ssh_client = ssh_client

    def upload_file(self):
        """
            指定檔案傳送伺服器
        :return:
        """

        print("【拖拽檔案到此處】")
        local_path = input()
        # 如果沒有資料則退出
        if not local_path:
            sys.exit()

        remote_path = '/data/workdir/ftp/'

        print("\r", '正在上傳 · · · ', end='', flush=True)
        client = SCPClient(self.ssh_client.get_transport(),buff_size=1024 * 64, socket_timeout=15.0)
        try:
            client.put(local_path, remote_path)
            print("\r", "檔案 [%s] 上傳完成" % local_path.split(os.sep)[-1], end='', flush=True)
            print()
            remote_path += local_path.split(os.sep)[-1]
            self.unzip_file(remote_path)
        except FileNotFoundError as e:
            print(e)
            print("系統找不到指定檔案" + local_path)

    def unzip_file(self, remote_path):
        """
        -d  extract files into exdir
        :param remote_path:
        :return:
        """

        extract_files_into = '/data/workdir/nginx-data/'

        print("\r", '正在解壓 · · · ', end='', flush=True)
        # 執行命令
        print("\r", '清理檔案 · · · ', end='', flush=True)
        self.ssh_client.exec_command("rm -rf %s*" % extract_files_into)
        stdin, stdout, stderr = self.ssh_client.exec_command("unzip -d %s %s" % (extract_files_into, remote_path))
        # stdin  標準格式的輸入,是一個寫許可權的檔案物件
        # stdout 標準格式的輸出,是一個讀許可權的檔案物件
        # stderr 標準格式的錯誤,是一個寫許可權的檔案物件
        print(stdout.read().decode())
        print("解壓完成")

    def __del__(self):
        """
        當物件釋放時,關閉連結
        :return:
        """
        self.ssh_client.close()


if __name__ == '__main__':
    zfd = zip_file_deploy()
    while True:
        zfd.upload_file()

相關文章