![错误还是功能? Grep 接受文件作为标志](https://linux22.com/image/114249/%E9%94%99%E8%AF%AF%E8%BF%98%E6%98%AF%E5%8A%9F%E8%83%BD%EF%BC%9F%20Grep%20%E6%8E%A5%E5%8F%97%E6%96%87%E4%BB%B6%E4%BD%9C%E4%B8%BA%E6%A0%87%E5%BF%97.png)
我刚刚遇到了一个奇怪的场景,我不确定这是否是一个功能,如果不是,它代表了什么样的安全隐患? grep 可能什么都没有,但其他目录爬行实用程序可能吗?
重现方法如下:
touch ./-vR
grep hi *
请注意,所有未hi
返回的内容都会递归返回。
答案1
这是 GNU 的一个已知缺陷getopt
(用于 GNU 工具的选项解析)。
grep hi -vR
hi
POSIX 要求在名为选项的文件中查找-vR
许多过去非选项参数无法识别的选项(如下hi
所示)。
大多数 GNU 工具或在默认模式下使用的工具或 GNU getopt
API 都不遵守这一点,除非POSIXLY_CORRECT
在环境中。
所以你需要:
POSIXLY_CORRECT=1 grep hi *
(强制grep
以符合 POSIX 标准的方式运行)或
grep -- hi *
(用 明确标记选项的结尾--
)或
grep hi ./*
(确保所有文件名都以 开头./
,所以不是-
)。
无论如何,与:
grep -e hi -vR
你会遇到 GNU 和非 GNU 的问题,grep
因为这hi
不是非选项参数,而是选项的参数-e
,所以你需要:
grep -e hi -- *
或(更好,因为它还解决了名为 的文件的问题-
):
grep -e hi ./*
(POSIXLY_CORRECT 没有帮助)。
答案2
grep
这是 GNU (以及以相同方式进行命令行解析的其他 GNU 实用程序)的一个“功能” 。 GNU 使用的命令行解析例程允许指定标志后命令行上的最终操作数应该是什么。
要解决此问题,请明确告诉实用程序将不再有命令行标志:
$ grep -- hi *
这会强制将shellgrep
扩展的文件名视为文件名而不是选项。*