/ proc와 raw 디스크에서`grep '을하는 정확한 이유는 무엇입니까?


9

나는 grep -r "searchphrase" /오늘 달렸고 그것은 효과가 없었다. 나는 약간의 연구를했고 find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"올바른 접근 방식으로 밝혀 졌습니다.

나는 성공하지 못한 grep에 대한 범인 /proc과 같은 디스크를 모으고 디스크를 /dev/sda1만듭니다.

"왜"에 대한 깊은 기술적 배경을 갖고 싶습니다. 나는 /proc통과 할 때 무한 링크를 만드는 내부 링크가 있다고 생각하며 더 많은 이유가 있지만 특정하지는 않습니다.

또한 원시 디스크가 잘릴 경우 어떻게됩니까? 파일 시스템 유형의 a /dev/sda1mount디스크의 데이터를 이해하기 쉽기 때문에 이진 데이터 ( 내가 아는 한 액세스 할 수 있습니까)를 해석 할 수 없습니까? 따라서 여전히 이진 문자열을 잡을 수 있습니까?

답변:


11

예, 당신은 할 수 grep /dev/sda1/proc하지만 당신은 아마 싶지 않아. 더 자세하게:

  1. 예,의 바이너리 내용을 grep 할 수 있습니다 /dev/sda1. 그러나 현대의 대형 하드 디스크에서는 시간이 오래 걸리고 결과가 유용하지 않을 수 있습니다.

  2. 그렇습니다. 내용을 정리할 수는 /proc있지만 컴퓨터의 메모리는 파일로 매핑되어 있습니다. 기가 바이트의 RAM이 장착 된 최신 컴퓨터에서는 grep하는 데 시간이 오래 걸리고 결과가 유용하지 않을 수 있습니다.

예외적으로, 파일 시스템이 손상된 하드 디스크 grep something /dev/sda1에서 데이터를 찾는 경우 파일 데이터 복구 시도의 일부로 실행될 수 있습니다 .

다른 문제가있는 파일 /dev

/dev인내심이 충분하다면 하드 디스크와 하드 디스크 파티션 이 손상 될 수 있습니다. 그러나 다른 파일 (hat tip : 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하는 것이 유용 할 수 있습니다 . 예를 들어 5 개의 임의의 영숫자 문자를 얻으려면 :

    $ 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

옆으로, grepgrep이 특정 파일이나 디렉토리를 검색하지 못하게하는 제한된 기능을 제공합니다. 예를 들어, 모든 디렉토리 이름을 제외 할 수 있습니다 proc, sys그리고 dev와 그렙의 재귀 검색에서 :

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

또한, 우리는 제외 할 수 있습니다 proc, sys그리고 dev떠들썩한 파티의 확장 globs의 사용 :

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

감사! 좋은 답변입니다. 오늘 밤 또 다른 영웅이 나오지 않으면 내일 받아 들일 것입니다! 한 가지 더 궁금해하고 너무 멀지 않기를 바랍니다. 매핑 된 메모리로 이어지는 grep파일을 검색 하면 (랜덤) 메모리 내부의 EOF에 도달 하여 다음 데이터를 다음과 같이 해석 할 수 있습니다. 검색 할 새 파일 이름? 소스 코드를 읽기 시작 했지만 너무 많이 보지 않을 것 같습니다. /procgrepgrep
curious_weather

1
@krork CP / M과 같은 일부 오래된 운영 체제에서는 파일 끝이 EOF 문자로 표시되었습니다. 최신 파일 시스템은 파일 크기를 추적하기 때문에 이러한 문자가 사용되지 않습니다.
John1024

2
/devgrep이 스캔을 시작 /dev/zero하거나 유사한 것으로 시작하면 grepping 이 끝나지 않을 수 있습니다 . 해당 파일이 /proc또는에 있는지 확실하지 않습니다 /sys.
user2313067

1
좋은 지적이야! GNU grep은 검색을 거부하지만 중지하지 않으면 영원히 /dev/zero검색 /dev/random합니다. 답변이 업데이트되었습니다.
John1024

/ proc 또는 / sys로 많은 작업을 수행하지는 않지만 언제든지 업데이트 될 수있는 가상 디렉터리이므로 여러 번 실행하면 예기치 않은 / 반복 불가능한 결과가 발생할 수 있습니다. 물론 이것은 일반 파일 시스템에서도 발생할 수 있지만 여기서는 더 놀랍습니다.
Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.