Administrator
Published on 2023-01-27 / 20 Visits
0
0

使用python 做sftp传输文件到linux,结合thiner传参

本工具是一开始使用做oss传输后因为不稳定直接改成传输到Linux服务器,在使用服务器传输到oss,如果有需要的部分可自行修改

# -*- coding: utf-8 -*-
import os
import paramiko
import tkinter as tk
from tkinter import filedialog
from tkinter import simpledialog


host=192.168.1.1
port=22
username=root
pwd=你的密码
class SSHConnection(object):

    def __init__(self, host, port, username, pwd):
        self.__transport = None
        self.host = host
        self.port = port
        self.username = username
        self.pwd = pwd
        self.__k = None

    def connect(self):
        transport = paramiko.Transport((self.host, self.port))
        transport.connect(username=self.username, password=self.pwd)
        self.__transport = transport

    def close(self):
        self.__transport.close()

    def upload(self, local_path, target_path):
        # 上传数据
        sftp = paramiko.SFTPClient.from_transport(self.__transport)
        sftp.put(local_path, target_path)

    # def download(self, remote_path, local_path):
    #     # 下载数据
    #     sftp = paramiko.SFTPClient.from_transport(self.__transport)
    #     sftp.get(remote_path, local_path)

    def cmd(self, command):
        ssh = paramiko.SSHClient()
        ssh._transport = self.__transport
        # 执行命令
        stdin, stdout, stderr = ssh.exec_command(command)
        # 获取命令结果
        result = stdout.read()
        print(str(result, encoding='utf-8'))
        return result

if __name__ == '__main__':
    ssh = SSHConnection(host=host, port=port, username=username, pwd=pwd)
    ssh.connect()
    root = tk.Tk()
    root.withdraw()
    filename = filedialog.askopenfilename()
    res = simpledialog.askstring('标题', prompt='请输入要上传的版本号eg:v1.2.161', initialvalue='默认值')
    if res is None:
        print("请重新运行脚本,输入参数,本参数不做校验,输入错误请手工删除OSS上的资源")
        os.system("pause")
        exit(1)
    asd = filename.split('/')[-1]
    cmd = r'/data/oss/'
    '''判断传输的目录是否存在文件,有则取消不运行该脚本'''
    if asd == 'Android.zip':
        filesize = ssh.cmd("ossutil64 du oss://test/test/test/{0}/Android/ |grep 'total du size(byte)'|cut -d ':' -f 2".format(res))
        filesizeq = int(filesize)
        print("filesizeq")
        if filesizeq == 0:
            print("恭喜你,通过校验,请输入回车继续执行上传动作")
            os.system("pause")
            print("正在准备上传文件")
        else:
            print("oss已经存在文件请确定:{0} 是否在oss存储桶存在Android文件,如果需要需要重新上传则删除下面的文件在重新运行该脚本".format(res))
            instr = input("请输入Y或者y确认强制覆盖,输入其他或者不输入则不运行脚本: ")
            os.system("pause")
            if instr == 'Y' or instr == 'y':
                print("正在强制上传中")
            else:
                exit(0)
    elif asd == 'iOS.zip':
        filesize = ssh.cmd("ossutil64 du oss://test/test/test/{0}/iOS/ |grep 'total du size(byte)'|cut -d ':' -f 2".format(res))
        filesizeq = int(filesize)
        print("filesizeq")
        if filesizeq == 0:
            print("恭喜你,通过校验,请输入回车继续执行上传动作")
            os.system("pause")
            print("正在准备上传文件")
        else:
            print("oss已经存在文件请确定:{0} 是否在oss存储桶存在iOS文件,如果需要需要重新上传则删除下面的文件在重新运行该脚本".format(res))
            instr = input("请输入Y或者y确认强制覆盖,输入其他或者不输入则不运行脚本: ")
            os.system("pause")
            if instr == 'Y' or instr == 'y':
                print("正在强制上传中")
            else:
                exit(0)
    print("本次上传的版本是{0},以及本次上传的压缩包名字是{1}".format(res,asd))
    print("确定是否开始上传,确定的话请输入回车!")
    os.system("pause")
    print("正在上传压缩包名字为{0},请耐心等候".format(filename))
    ssh.upload(filename, cmd + asd)
    if asd == 'Android.zip':
        print ("正在往oss仓库传输版本是{0},上传时间比较久,请耐心等待".format(res))
        ssh.cmd('cd /data/oss && rm -rf Android  && unzip Android.zip -d Android ')
        ssh.cmd("cd /data/oss && ossutil64 cp -r test oss://test/test/test/{0}/Android/ -f".format(res))
        print("文件已传输到{0}这个版本,请核对文件数目是否正确".format(res))
    elif asd == 'iOS.zip':
        print("正在往oss仓库传输版本是{0},上传时间比较久,请耐心等待".format(res))
        ssh.cmd('cd /data/oss && rm -rf  iOS  && unzip iOS.zip -d iOS ')
        ssh.cmd("cd /data/oss && ossutil64 cp -r test oss://goa-overseas-hotfix/hotfix/GoAOS/{0}/iOS/ -f".format(res))
        print("文件已传输到{0}这个版本,请核对文件数目是否正确".format(res))
    ssh.close()
    os.system("pause")

Comment