从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`执行的命令提供参数的方法
谢谢。