【问题标题】:How to pass arguments/parameters when executing bash/shell script from NodeJS [duplicate]从NodeJS执行bash / shell脚本时如何传递参数/参数[重复]
【发布时间】:2018-10-01 08:32:56
【问题描述】:

我有以下代码:

exec('sh cert-check-script-delete.sh', req.body.deletedCert);
console.log(req.body.deletedCert);

控制台日志正确显示req.body.deletedCert 非空。

cert-check-script-delete.sh 我有:

#!/bin/sh

certs.json="./"  # Name of JSON file and directory location
echo -e $1 >> certs.json

但它只是给certs.json写了一个空行

我也试过了:

exec('sh cert-check-script-delete.sh' + req.body.deletedCert)

但这两种格式都不起作用

【问题讨论】:

  • 顺便说一句,你没有给你的文件一个适当的 shebang(#!/bin/bash,因为echo -esh 不安全),设置 +x 位和没有显式解释器直接执行它?
  • 尝试在.sh后加一个空格,exec('sh cert-check-script-delete.sh ' + req.body.deletedCert)
  • @DaveCarruthers,这是一个巨大的安全风险。假设有人提交代码说他们想删除证书$(rm -rf ~)。您永远、永远、永远应该将来自传入请求的文本替换为作为 shell 命令的一部分解析的文本。
  • 感谢您的建议,但以这种格式编写它现在甚至没有将空行写入certs.json。另外关于shebang,我不知道有不同类型的shebang,我一定只是从网上复制粘贴了shebang
  • @DaveCarruthers 谢谢你的成功!

标签: node.js bash shell parameters arguments


【解决方案1】:

使用execFile(),并在带外传递您的参数:

child_process.execFile('./cert-check-script-delete.sh', [req.body.deletedCert])

这样你的字符串(来自req.body.deletedCert)作为文字参数传递,而不是作为代码解析。请注意,这要求您的脚本成功标记为可执行文件 (chmod +x check-cert-script-delete.sh),并且它以有效的 shebang 开头。


如果您无法修复您的文件权限以使您的可执行文件,至少传递参数带外:

child_process.execFile('/bin/sh', ['./check-cert-script-delete.sh', req.body.deletedCert])

【讨论】:

  • 感谢您的回答,但child_process 来自哪里?我定义了以下变量const exec = require('child_process').exec, child;,这是否足够或者我还需要导入其他任何东西?
  • const child_process = require('child_process') 将为您提供整个模块,而不仅仅是其中的一个功能。
  • 谢谢你的建议,但这仍然不起作用,我暂时使用了涉及空间的解决方案
  • @tnoel999888,回复:“不起作用”——值得深入研究细节。安全很重要,如果这不起作用,那是因为其他东西被破坏了(你的文件权限错误,或者你的 shebang 无效,等等)。
  • @tnoel999888, ...也就是说,如果你真的必须使用外壳,至少这样做:child_process.execFile('/bin/sh', ['./check-cert-script-delete.sh', req.body.deletedCert])
猜你喜欢
  • 2021-11-21
  • 2018-09-05
  • 2017-10-07
  • 2014-10-09
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多