버그 또는 기능? Grep은 파일을 플래그로 허용합니다.

버그 또는 기능? Grep은 파일을 플래그로 허용합니다.

방금 이상한 시나리오에 직면했습니다. 이것이 기능인지 확실하지 않으며 그렇지 않은 경우 어떤 종류의 보안 위험을 나타냅니까? grep은 아무것도 얻지 못할 수도 있지만 다른 디렉터리 크롤링 유틸리티를 사용할 수도 있습니까?

재현하는 방법은 다음과 같습니다.

  • touch ./-vR
  • grep hi *

반환되지 않은 항목은 모두 hi재귀적으로 반환됩니다.

답변1

getopt이것은 GNU (GNU 도구에 대한 옵션 구문 분석) 의 알려진 버그입니다 .

grep hi -vR

hi-vRPOSIX에서는 과거에 옵션이 아닌 인수로 인식되지 않았던 많은 옵션을 options라는 파일에서 찾아야 합니다 ( hi아래 참조).

대부분의 GNU 도구나 기본 모드 또는 GNU API에서 사용되는 도구는 환경을 getopt제외하고 이를 존중하지 않습니다 .POSIXLY_CORRECT

따라서 다음이 필요합니다.

POSIXLY_CORRECT=1 grep hi *

( grepPOSIX 호환 방식으로 강제 작동) 또는

grep -- hi *

(옵션의 끝을 명확하게 표시 --) 또는

grep hi ./*

(모든 파일 이름은 로 시작해야 하므로 ./그렇지 않습니다 -.)

어쨌든, 다음과 같이 하세요:

grep -e hi -vR

이것은 옵션이 아닌 인수가 아니라 옵션에 대한 인수이기 grep때문에 GNU 및 비 GNU 문제가 있으므로 다음이 필요합니다.hi-e

grep -e hi -- *

또는 (더 나은 이유는 이름이 지정된 파일의 문제도 해결하기 때문입니다 -):

grep -e hi ./*

(POSIXLY_CORRECT는 도움이 되지 않습니다).

답변2

grep이는 GNU(및 동일한 방식으로 명령줄 구문 분석을 수행하는 다른 GNU 유틸리티)의 "기능"입니다. GNU에서 사용하는 명령줄 구문 분석 루틴을 사용하면 플래그 지정이 가능합니다.뒤쪽에명령줄의 마지막 피연산자는 무엇입니까?

이 문제를 해결하려면 더 이상 명령줄 플래그가 없음을 유틸리티에 명시적으로 알립니다.

$ grep -- hi *

이렇게 하면 쉘 grep확장 파일 이름이 옵션이 아닌 파일 이름으로 처리됩니다.*

관련 정보