현재 디렉터리의 모든 파일에서 여러 문자열을 검색하는 bash 스크립트를 작성하는 방법은 무엇입니까?

현재 디렉터리의 모든 파일에서 여러 문자열을 검색하는 bash 스크립트를 작성하는 방법은 무엇입니까?

Bash 스크립트를 원합니다:

  1. 현재 디렉터리의 모든 파일에 대해 "strings" 명령을 실행합니다.
  2. grep을 사용하여 각 파일의 문자열 출력에서 ​​특정 용어를 검색하십시오.

다음이 있지만 스크립트 출력에 일치하는 항목이 표시되지 않습니다.

#!/bin/bash

echo "Searching files in directory for secrets and urls"

for file in ./*
do
   echo "=====$file====="
   strings ${file} | egrep -wi --color 'secret\|password\|key\|credential|\http'
done

나도 그것을 시도했지만 strings $file | egrep -wi --color 'secret\|password\|key\|credential|\http'작동 eval "strings ${file} | egrep -wi --color 'secret\|password\|key\|credential|\http'"하지 않는 것 같습니다. 스크립트는 파일 이름을 출력하지만 일치하는 항목은 출력하지 않습니다.

답변1

을 사용하는 egrep것과 동일합니다 grep -E. 즉, 확장 정규식을 사용할 수 있습니다.

확장 정규식에서는 |대체 항목(사용하려는 항목)이며 \|리터럴 |문자와 일치합니다.

그러므로 당신은 원한다

grep -w -i -E 'secret|password|key|credential|http'

또는

grep -i -E '\<(secret|password|key|credential|http)\>'

where \<\>단어 경계와 일치합니다.

또는

grep -w -i -F \
    -e secret      \
    -e password    \
    -e key         \
    -e credential  \
    -e http

...정규식 일치 대신 문자열 비교를 수행하려는 경우.

또한 변수 확장에는 항상 큰따옴표를 사용하는 것이 좋습니다. 또한 이름에 공백 문자(공백, 탭, 줄 바꿈)가 포함된 파일과 파일 이름 와일드카드( *, , )가 포함된 ?파일 을 올바르게 처리할 수 있습니다.[...]

#!/bin/sh

for name in ./*; do
    [ ! -f "$name" ] && continue    # skip non-regular files

    printf '==== %s ====\n' "$name"
    strings "$name" | grep ...
done

당신은 또한 볼 수 있습니다

답변2

루프는 for불필요합니다. 파일 이름과 소수점 오프셋을 출력하는 데 사용되며 strings, 최소 3자 길이의 문자열을 다음으로 파이프합니다 egrep.

strings -n 3 -f -t d ./* 2> /dev/null | 
egrep '[[:alnum:][:punct:]]*(secret|password|key|credential|http)'\
'[[:alnum:][:punct:]]*$' 

누락을 방지하려면 기본 4자가 아닌 3자가 필요합니다."열쇠".

샘플 입력 파일이 없기 때문에 다음은 디렉터리의 처음 10개 히트를 보여주는 데모입니다 /bin/.

strings -n 3 -f -t d /bin/* 2> /dev/null |  
egrep '[[:alnum:][:punct:]]*(secret|password|key|credential|http)'\
'[[:alnum:][:punct:]]*$' | 
head

내 시스템의 출력:

/bin/bash:   78590 rl_discard_keymap
/bin/bash:   78720 rl_executing_key
/bin/bash:   79076 rl_bind_key
/bin/bash:   79847 emacs_standard_keymap
/bin/bash:   79905 _rl_keymap
/bin/bash:   81110 _rl_executing_keyseq_size
/bin/bash:   81598 rl_bind_keyseq_if_unbound
/bin/bash:   81640 rl_bind_keyseq
/bin/bash:   81736 bind_keyseq_to_unix_command
/bin/bash:   81863 _rl_dispatching_keymap

관련 정보