首页 > 解决方案 > 如果传递了特殊字符,则 execsync 失败

问题描述

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

objMedInfo = JSON.parse(proc.execSync('mediainfo "' + currentfilename + '" --output=JSON').toString());

然后我想也许一种不同的格式会更健壮:

objMedInfo = JSON.parse(proc.execSync("mediainfo", [currentfilename,"--output=JSON"]).toString());

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

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

标签: javascriptnode.js

解决方案


您需要转义引号并防止任何 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

推荐阅读