为“bash -c”执行的命令提供参数的方法

为“bash -c”执行的命令提供参数的方法

在某人对我的一篇帖子的回复中(我忘记了),我记得

bash -c "somecommand \$1" bash $somevariable

代替

bash -c "somecommand $somevariable"

在 findutils 手册中再次看到这个例子

find -exec sh -c 'something "$@"' sh {} \;

代替

find -exec sh -c "something {}" \;

这两个示例是否有相同的理由使用第一个解决方案而不是另一个解决方案?如果是,那是什么?

启发为什么命令注入在此示例中不起作用?以下是 bash 中命令注入的唯一形式吗?

答案1

是的。这两个示例都应将参数传递给bash -csh -c作为论点(可能被引用)而不是将它们作为字符串注入到代码中。

将代码作为字符串注入内联 shell 脚本可能会允许注入的字符串突破控制结构并执行任意命令,或者让 shell 执行应被视为文本的扩展。

例子:

bash -c "echo $arg"

设置$arg为字符串; ls -la

find示例中,当文件名或路径名破坏了它们所注入的 shell 脚本的语法或修改了控制流时,这就会成为一个问题,可能会产生不需要的后果。

附加参考:

相关内容