有没有一种安全的方法来防止 exec 剥离引号?
Is there a secure way to prevent exec from stripping quotes?
我想 运行 通过节点的子进程 exec 方法执行命令,该命令将包含一个 JSON 字符串,该字符串本身将包含引号字符。似乎 exec 默认情况下会剥离这些。有什么办法可以避免这种情况吗?
我正在尝试在 netlify 中自动创建构建挂钩,作为我们目前正在尝试构建的一些自动化 QA 的一部分。目前,我正在使用 netlify cli 执行此操作,特别是他们的 netlify api createSiteBuildHook
方法。我想捕获此命令的输出并将一些数据注入命令,因此我尝试使用节点的子进程 exec()
命令来解决此问题。我在这里 运行 的问题是 netlify 命令需要一个 JSON 字符串作为命令的参数,事实证明,默认情况下 exec 去除引号,我假设是出于安全原因.我希望有办法解决这个问题。
我尝试并考虑过的一些替代方案:
- 我之前尝试使用 netlify api js 客户端来解决这个问题,但是我们一直在 运行 解决自动刷新 api 令牌的问题。这是 运行 作为 CircleCI 中自动构建过程的一部分,因此它是从任何交互中抽象出来的。我想避免每次我们的构建和自动测试停止工作时,开发人员都必须进入并手动更新它,因为我们已经超过了速率限制或其他原因。
- 我试过使用 escaping 引号,例如
\"
、^"
等都无济于事。
- 我试过使用其他子进程方法,如 spawn 或 execFile,但我似乎遇到了同样的问题。
- 最后一个选择是将其完全抽象为 bash。这并非完全行不通,只是会很烦人。我必须将输出保存在一个文件中,然后加载该文件并在我想为我新生成的构建挂钩等获取 url 时询问它。如果我可以在 js 中完成这项工作,它将节省一个很多时间。
我用来生成构建挂钩的命令:
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 就足够了。)
我想 运行 通过节点的子进程 exec 方法执行命令,该命令将包含一个 JSON 字符串,该字符串本身将包含引号字符。似乎 exec 默认情况下会剥离这些。有什么办法可以避免这种情况吗?
我正在尝试在 netlify 中自动创建构建挂钩,作为我们目前正在尝试构建的一些自动化 QA 的一部分。目前,我正在使用 netlify cli 执行此操作,特别是他们的 netlify api createSiteBuildHook
方法。我想捕获此命令的输出并将一些数据注入命令,因此我尝试使用节点的子进程 exec()
命令来解决此问题。我在这里 运行 的问题是 netlify 命令需要一个 JSON 字符串作为命令的参数,事实证明,默认情况下 exec 去除引号,我假设是出于安全原因.我希望有办法解决这个问题。
我尝试并考虑过的一些替代方案:
- 我之前尝试使用 netlify api js 客户端来解决这个问题,但是我们一直在 运行 解决自动刷新 api 令牌的问题。这是 运行 作为 CircleCI 中自动构建过程的一部分,因此它是从任何交互中抽象出来的。我想避免每次我们的构建和自动测试停止工作时,开发人员都必须进入并手动更新它,因为我们已经超过了速率限制或其他原因。
- 我试过使用 escaping 引号,例如
\"
、^"
等都无济于事。 - 我试过使用其他子进程方法,如 spawn 或 execFile,但我似乎遇到了同样的问题。
- 最后一个选择是将其完全抽象为 bash。这并非完全行不通,只是会很烦人。我必须将输出保存在一个文件中,然后加载该文件并在我想为我新生成的构建挂钩等获取 url 时询问它。如果我可以在 js 中完成这项工作,它将节省一个很多时间。
我用来生成构建挂钩的命令:
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 就足够了。)