从findutils的手册中:
例如这两个命令的构造
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;非常危险 这样做的原因是将'{}'扩展为一个文件名,该文件名可能包含分号或外壳程序专用的其他字符。例如,如果有人创建了文件,
/tmp/foo; rm -rf $HOME则上面的两个命令可能会删除某人的主目录。因此,由于这个原因,请勿运行任何将不可信数据(例如文件名)传递给将参数解释为要进一步解释的命令的命令(例如“ sh”)的命令。
对于shell,有一个解决此问题的聪明方法:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;这种方法不能保证避免所有问题,但是比将攻击者选择的数据替换为shell命令的文本要安全得多。
- 问题的原因是否在于
find -exec sh -c "something {}" \;,对的替换{}未加引号,因此未视为单个字符串? 在解决方案中
find -exec sh -c 'something "$@"' sh {} \;,首先
{}被替换了,但是由于{}未引用,所以"$@"与原始命令也没有同样的问题吗?例如,"$@"将扩大至"/tmp/foo;","rm","-rf",和"$HOME"?为什么
{}不逃避或引用?
- 您能否
sh -c在适用find相同类型的问题和解决方案的情况下给出其他示例(仍然适用,或不使用;可能没有必要),而这些示例是最小的示例,因此我们可以着重解决以下问题和解决方案:尽可能少分心?查看为`bash -c`执行的命令提供参数的方法
谢谢。