/ proc和原始磁盘上的`grep`是个坏主意的确切原因是什么?


9

grep -r "searchphrase" /今天跑了,但是没有用。我做了一些研究,发现find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"是正确的方法。

我收集了/proc磁盘,这些磁盘/dev/sda1是导致grep不成功的元凶。

我希望了解有关“为什么”的一些深厚的技术背景。我认为/proc遍历中的某些链接会创建无限循环,并且我读到的原因更多,但没有具体原因。

此外,当原始磁盘被grepped时会发生什么?二进制数据(/dev/sda1据我所知可以访问吗?)不能被解释,因为只有mount具有文件系统类型的二进制文件才能使磁盘中的数据易于理解?因此,仍然可以对二进制字符串进行grep吗?

Answers:


11

是的,您可以grep /dev/sda1/proc但您可能不想这样做。更详细地:

  1. 是的,您可以运行grep的二进制内容/dev/sda1。但是,对于现代大型硬盘,这将花费很长时间,并且结果可能不会有用。

  2. 是的,您可以grep的内容,/proc但要注意您的计算机内存已作为文件映射到其中。在具有千兆字节RAM的现代计算机上,这将花费很长时间进行grep,并且再次,结果不太可能有用。

作为例外,如果要在文件系统已损坏的硬盘上查找数据,则可能会在grep something /dev/sda1尝试恢复文件数据的过程中运行。

中的其他有问题的文件 /dev

/dev如果有足够的耐心,则可以将下面的硬盘和硬盘分区改写。但是,其他文件(提示:user2313067)可能会引起问题:

  1. /dev/zero是无限长度的文件。幸运的是,grep(至少是GNU版本)足够聪明,可以跳过它:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/random并且/dev/urandom也是无限的。该命令grep something /dev/random将永远运行,除非grep发出停止信号。

    /dev/urandom生成密码时grep很有用。例如,要获得五个随机的字母数字字符:

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    这不是无限的,因为在收到足够的字符后,它将head关闭管道,从而导致grep终止。

无限循环

“ ...链接...遍历时会创建无限循环...”

Grep(至少是GNU版本)足够聪明,无法做到这一点。让我们考虑两种情况:

  1. 使用该-r选项时,除非在命令行上明确指定,否则grep 不会跟随符号链接。因此,无限循环是不可能的。

  2. 使用该-R选项,grep 遵循符号链接,但会检查它们并拒绝陷入循环。为了显示:

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

从以下目录中排除有问题的目录 grep -r

顺便说grep一句,提供了一种有限的功能来阻止grep搜索某些文件或目录。例如,您可以排除所有目录命名procsys以及dev可以从grep的递归搜索具有:

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

另外,我们可以排除procsys和,并dev使用bash的扩展glob:

shopt -s extglob
grep -r something /!(proc|sys|dev)

谢谢!那是一个很好的答案。除非今晚有另一个英雄从黑暗中出来,否则我明天会接受!我想知道又一件事,希望它不会太远:如果grep/proc其中搜索一个文件导致映射的内存,是否有可能grep在(随机)内存中命中EOF,并将以下数据解释为要搜索的新文件名?我已经开始阅读grep源代码,但是我想我不会在其中看到太多。
curious_weather

1
@krork在某些旧的操作系统(如CP / M)中,文件末尾由EOF字符表示。由于现代文件系统会跟踪文件的大小,因此这些字符已不再使用。
John1024 '16

2
/dev随着grep开始进行扫描/dev/zero或类似操作,抓捕可能永远不会结束。不确定如果存在这样的文件/proc/sys
user2313067 16/10/14

1
@ user2313067好点!尽管GNU grep将拒绝搜索/dev/zero,但它将/dev/random一直搜索,除非停止。答案已更新。
John1024 '16

我对/ proc或/ sys的处理不多,但是由于这些目录是虚拟目录,可以随时更新,因此多次运行可能会导致意外/无法复制的结果。当然,这也可能在常规文件系统中发生,但是在这里可能更令人惊讶。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.