Node.js调用child_process执行aws s3 cp文件名带括号报错如何解决?
报错根因
child_process.spawn的数组传参默认不会经过shell解析,你手动给路径参数包裹双引号后,双引号会被作为路径的一部分传递给aws cli,导致cli无法识别合法的路径格式,所以抛出Invalid argument type报错。
解决方法
如果你的SpawnTimeout封装的spawn没有开启shell: true(spawn默认不开启shell),直接去掉参数中手动添加的双引号即可:
import { spawn, ChildProcess } from 'child_process'; /// 部分逻辑省略 const s3Cp = (source: string, target: string) => { logger.info(`starting s3 sync. source : ${source}, target ${target}`); // 直接传递原始source、target,不需要额外包裹引号 const childProcess = new SpawnTimeout('aws', ['s3', 'cp', source, target, '--only-show-errors'], S3_SYNC_TIMEOUT, 's3 sync'); return childProcess.exec(); };
这种场景下,文件名里的括号、空格等特殊字符会被原样传递给aws cli,不需要额外转义,不会出现解析错误。
如果你的SpawnTimeout封装逻辑强制开启了shell: true,优先关闭shell配置即可,如果因业务逻辑必须保留shell开启的配置,可以使用转义库对路径参数做转义处理,不要手动添加引号。
内容的提问来源于stack exchange,提问作者David Faizulaev
相关产品推荐
相关产品推荐

