如何在AWS同S3存储桶不同文件夹间移动文件并正确识别变量
问题原因
- 你定义的
name、times是Python层面的变量,没有传递到shell执行环境中,shell无法识别这两个变量 - 你使用单引号包裹整个cmd命令,单引号在shell中会禁止内部的
$变量解析,就算shell能拿到变量也不会展开 $name_的写法会被shell识别为名为name_的变量,而非name变量拼接下划线,变量边界识别错误- 你的代码还存在语法错误:
except TimeoutExpired分支下两条语句没有换行,也没有导入TimeoutExpired类,且没有捕获标准错误流,无法排查执行报错
解决方案
推荐方案:禁用shell=True,直接传递参数列表(更安全,无注入风险)
直接在Python层面完成路径拼接,将命令拆分为参数列表传给Popen,不需要依赖shell做变量解析:
import time import subprocess times = time.strftime("%Y/%m/%d-%H:%M:%S") name = "test1" if "test" in name: # Python层面完成路径拼接,不需要shell处理变量 src = f"s3://bucket_name/folder/folder1/{name}" dest = f"s3://bucket_name/folder/folder2/{name}_{times}" # 命令拆分为列表,关闭shell=True proc = subprocess.Popen( ["aws", "s3", "mv", src, dest], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) try: outs, errs = proc.communicate(timeout=15) # 执行异常时可打印错误信息排查:print(errs.decode()) except subprocess.TimeoutExpired: proc.kill() outs, errs = proc.communicate()
兼容方案:保留shell=True,修正变量传递逻辑
如果必须使用shell=True,需要在Python层面完成变量替换再传给shell,或者明确导出环境变量并修正变量边界:
import time import subprocess times = time.strftime("%Y/%m/%d-%H:%M:%S") name = "test1" if "test" in name: # 用f-string直接在Python中完成命令拼接,不需要shell解析变量 cmd = f"aws s3 mv s3://bucket_name/folder/folder1/{name} s3://bucket_name/folder/folder2/{name}_{times}" proc = subprocess.Popen( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) try: outs, errs = proc.communicate(timeout=15) except subprocess.TimeoutExpired: proc.kill() outs, errs = proc.communicate()
排查技巧
遇到命令执行异常时,可以先打印最终生成的命令字符串,和可用的硬编码命令对比,就能快速发现变量未替换、路径错误等问题。
内容的提问来源于stack exchange,提问作者yass_dev
相关产品推荐
相关产品推荐

