AWS Lambda下exiftool的SubSecDateTimeOriginal更新失效问题求助
问题成因
- 核心原因是
subprocess.run使用列表传参时的参数解析规则和shell执行逻辑不同:
当你给列表项中的参数值包裹双引号时,subprocess.run不会像shell一样自动剥离引号,而是会把双引号作为参数值的一部分传给exiftool。此时exiftool收到的SubSecDateTimeOriginal值为"2021:11:30 03:47:50.084+00:00"(首尾自带双引号),不符合时间格式规范,触发ValueConvInv转换错误,仅能正常解析出不带亚秒的DateTimeOriginal字段,亚秒部分直接丢弃。 os.system执行正常的原因是该方法会将完整命令交给系统shell处理,shell会自动去除参数的包裹引号,最终传给exiftool的时间值是符合格式要求的,因此运行正常。
修复方案
推荐使用无安全风险的列表传参修正方案,直接去掉参数值外层的双引号即可,subprocess.run会自动将包含空格的完整时间值作为单个参数传递给exiftool:
cmd = [ '/opt/bin/exiftool', '-SubSecDateTimeOriginal=2021:11:30 03:47:50.084+00:00', # 去掉外层双引号 '-overwrite_original', '/mnt/processing/000001.jpg' ] output = subprocess.run(cmd, capture_output=True)
如果需要兼容原有带引号的写法,也可以给subprocess.run添加shell=True参数,但该方案存在命令注入风险,不建议在参数包含用户输入的场景下使用:
cmd = '/opt/bin/exiftool -SubSecDateTimeOriginal="2021:11:30 03:47:50.084+00:00" -overwrite_original /mnt/processing/000001.jpg' output = subprocess.run(cmd, shell=True, capture_output=True)
修正后重新执行写入命令,再查询即可看到SubSecDateTimeOriginal字段正常返回。
内容的提问来源于stack exchange,提问作者code0x00
相关产品推荐
相关产品推荐

