import os import shutil import paramiko import argparse import Contant from LoggerUtils import Logger, initLogger import configparser import requests import time # python3 sftp.py --local="/mnt/tmp_srt_file" --logDir="./logs" # python3 sftp.py --local="/mnt/test_file" --logDir="./logs" if __name__ == "__main__": # 读取参数 parser = argparse.ArgumentParser(description="") parser.add_argument("--local", type=str, default="") parser.add_argument('--logDir', type=str, default='') args = parser.parse_args() Contant.logDir = args.logDir initLogger() # 读取配置文件 config = configparser.ConfigParser() config.read('sftp_config.ini') # 获取SFTP配置信息 hostname = config.get('sftp_config', 'hostname') port = config.getint('sftp_config', 'port') username = config.get('sftp_config', 'username') password = config.get('sftp_config', 'password') Logger.info("host:{},port:{},username:{},password:{}".format( hostname, port, username, password)) ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) sftp_client = None # 设置默认值 ssh_client.connect(hostname, port, username, password) # 创建SFTP客户端 sftp_client = ssh_client.open_sftp() Logger.info("SFTP客户端已经建立:{}".format(sftp_client)) remote_root = "/Inbound/YouTube Captions" local_root = args.local Logger.info("remote_root:{},local_root:{}".format(remote_root, local_root)) names = os.listdir(local_root) for name in names: # sftp创建文件夹 try: sftp_client.chdir(remote_root + "/" + name) except BaseException: sftp_client.mkdir(remote_root + "/" + name) sftp_client.chdir(remote_root + "/" + name) # 遍历本地临时文件夹 srtList = os.listdir(local_root + "/" + name) for srt in srtList: # 获取远程文件路径以及本地文件路径 remotePath = remote_root + "/" + name + "/" + srt localPath = local_root + "/" + name + "/" + srt # 如果远程文件存在,则进行删除 try: sftp_client.stat(remotePath) # 如果文件存在,删除它 sftp_client.remove(remotePath) Logger.info("Remote file '{}' deleted.".format(remotePath)) except FileNotFoundError: Logger.info("Remote file '{}' not found.".format(remotePath)) # 上传本地文件 try: # 判断远程地址长度,过长需要截取一部分 if len(remotePath) > 120: remotePath = remotePath[:-20] + ".srt" # 判断本地文件是否存在,存在则上传 if os.path.exists(localPath): Logger.info("本地文件 '{}' 存在,开始上传.".format(localPath)) sftp_client.put(localPath, remotePath, confirm=False) os.remove(localPath) else: Logger.info("本地文件 '{}' 不存在,无法上传.".format(localPath)) except Exception as e: Logger.info("上传失败 '{}' 文件名长度{}".format( remotePath, len(remotePath))) Logger.error(e) sftp_client.close() sftp_client = ssh_client.open_sftp() # 发送钉钉消息 webhook = "https://oapi.dingtalk.com/robot/send?access_token=c8c8d7d42c4eecd449dd303025ef968f647d1d8e8694e3fabc0ab5770d646dcb" jsonData = { "msgtype": "text", "text": { "content": "[Youtube]sftp finished" } } requests.post(webhook, json=jsonData) Logger.info("sftp发送钉钉消息成功...")