提问者:小点点

如果传递特殊字符,execsync将失败


我正在尝试运行一个对视频文件的一些命令进行处理。 视频文件名可能包含特殊字符,如空格,“和”等。因此,我的第一次尝试是在多个文件上中断:

objMedInfo=json.parse(proc.execsync('mediaInfo“'+currentfilename+'”--output=json').toString());

然后我想也许另一种格式会更健壮:

objMedInfo=json.parse(proc.execsync(“mediaInfo”,[currentfilename,“--output=json”]).toString());

但是,它根本不会运行。 有人能帮忙吗?

(特别是,为什么第二种形式不起作用?)


共2个答案

匿名用户

不确定这是否有用,看起来像是创可贴。

node.js中的execSync无法正确运行shell命令

希望能提供一些帮助,直到有更聪明的人看到这一点:)。

匿名用户

您需要转义引号,并防止任何cmd注入shinanigans。

function shellescape(a) {
  let ret = []
  a.forEach(function (s) {
    if (/[^A-Za-z0-9_/:=-]/.test(s)) {
      s = "'" + s.replace(/'/g, "'\\''") + "'"
      s = s.replace(/^(?:'')+/g, '').replace(/\\'''/g, "\\'")
    }
    ret.push(s)
  })
  return ret.join(' ')
}

currentfilename = 'filenames"with\'quotesAnd Spaces;shutdown now;.jpg'

console.log('mediainfo ' + shellescape([currentfilename]) + ' --output=JSON')

// mediainfo 'filenames"with'\''quotesAnd Spaces;shutdown now;.jpg' --output=JSON