gpt4 book ai didi

javascript - 有没有一种安全的方法来防止 exec 剥离引号?

转载 作者:行者123 更新时间:2023-11-30 19:09:39 25 4
gpt4 key购买 nike

我想通过 Node 的子进程 exec 方法运行一个命令,该方法将包含一个 JSON 字符串,该字符串本身将包含引号字符。似乎 exec 默认情况下会剥离这些。有办法避免这种情况吗?

我正在尝试在 netlify 中自动创建构建 Hook ,作为我们目前正在尝试构建的一些自动化 QA 的一部分。目前,我正在使用 netlify cli 执行此操作,特别是他们的 netlify api createSiteBuildHook 方法。我想捕获此命令的输出并将一些数据注入(inject)命令,因此我尝试使用 Node 的子进程 exec() 命令来解决此问题。我在这里遇到的问题是 netlify 命令需要一个 JSON 字符串作为命令的参数,事实证明,exec 默认情况下会去除引号,我假设是出于安全原因。我希望有办法解决这个问题。

我尝试并考虑过的一些替代方案:

  • 我之前尝试使用 netlify api js 客户端来解决这个问题,但是我们一直遇到自动刷新 api token 的问题。这是作为 CircleCI 中自动构建过程的一部分运行的,因此它是从任何交互中抽象出来的。我想避免每次我们的构建和自动测试停止工作时,开发人员都必须进入并手动更新它,因为我们超过了速率限制或其他原因。
  • 我试过使用引号转义,例如 \"^" 等,但都无济于事。
  • 我尝试过使用其他子进程方法,例如 spawn 或 execFile,但我似乎遇到了同样的问题。
  • 最后一个替代方案是将其完全抽象为 bash。这并非完全行不通,只是会很烦人。我必须将输出保存在一个文件中,然后加载该文件并在我想获取新生成的构建 Hook 等的 url 时查询它。如果我可以在 js 中完成这项工作,它将节省大量时间。

我用来生成构建 Hook 的命令:

yarn netlify api createSiteBuildHook -d {"site_id":"my-site-id","body":{"title":"my-title","branch":"my-branch"}}

我用来通过 exec 运行它的代码:

yargs
.command(
'createBuildHook',
'Creates a build hook in netlify',
{},
async () => {
const buildHookRequest = JSON.stringify({
site_id: process.env.NETLIFY_MASTER_ID,
body: {
title: branchName(),
branch: branchName(),
}
});

const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest}`, (err, stout) => {
if (err) {
console.log(`Error: ${err}`);
}
console.log(`Output: ${stout}`);
});
}
)
.demandCommand().argv;

我尝试运行命令时遇到的错误:

$ yarn qa-automate:createBuildHook
yarn run v1.16.0
$ yarn qa-automate createBuildHook
$ babel-node --presets @babel/preset-env -- ./qa-automation/cli.js createBuildHook
Error: Error: Command failed: yarn netlify api createSiteBuildHook -d {"site_id":"my-site-id","body":{"title":"my-title","branch":"my-branch"}}
SyntaxError: Unexpected token s in JSON at position 1
at JSON.parse (<anonymous>)
at APICommand.run (C:/Users/owen_jones/web-work/website-assets/node_modules/netlify-cli/src/commands/api.js:45:61)
error Command failed with exit code 1.

Output: $ C:\Users\owen_jones\web-work\website-assets\node_modules\.bin\netlify api createSiteBuildHook -d {site_id:my-site-id,body:{title:my-title,branch:my-branch}}
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Done in 3.92s.

您可以在输出中看到它去除了引号。可能是其他东西在进行剥离,但我不知道是什么。

最佳答案

不是exec,是shell。

您可以通过使用反斜杠转义每个引号(和反斜杠)来解决它:

const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest.replace(/[\\"]/g, "\\$&")}`, (err, stout) => {

这可能不是一个可靠的通用解决方案,但对于您正在做的事情来说可能已经足够好了。 (我的快速本地测试足够好地通过了 JSON。)

关于javascript - 有没有一种安全的方法来防止 exec 剥离引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58625625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com