在某人对我的一篇帖子的回复中(我忘记了),我记得
bash -c "somecommand \$1" bash $somevariable
代替
bash -c "somecommand $somevariable"
find -exec sh -c 'something "$@"' sh {} \;
代替
find -exec sh -c "something {}" \;
这两个示例是否有相同的理由使用第一个解决方案而不是另一个解决方案?如果是,那是什么?
答案1
是的。这两个示例都应将参数传递给bash -c
或sh -c
作为论点(可能被引用)而不是将它们作为字符串注入到代码中。
将代码作为字符串注入内联 shell 脚本可能会允许注入的字符串突破控制结构并执行任意命令,或者让 shell 执行应被视为文本的扩展。
例子:
bash -c "echo $arg"
设置$arg
为字符串; ls -la
。
在find
示例中,当文件名或路径名破坏了它们所注入的 shell 脚本的语法或修改了控制流时,这就会成为一个问题,可能会产生不需要的后果。
附加参考: