次のようなbashスクリプトが必要です。
次のものがありますが、スクリプトの出力には一致が表示されません。
#!/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'"
しかし、これらは機能していないようです。スクリプトはファイル名を出力しますが、一致は出力しません。
grep -E
と同じegrep
を使用しています。つまり、拡張正規表現を使用できます。
拡張正規表現では、|
は代替(これが使用したいものです)であり、\|
はリテラル|
文字に一致します。
したがって、あなたは欲しい
grep -w -i -E 'secret|password|key|credential|http'
または
grep -i -E '\<(secret|password|key|credential|http)\>'
ここで、\<
および\>
は、単語の境界と一致します。
または
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
こちらもご覧ください
for
ループは不要です。 strings
を使用してファイル名と10進オフセットを出力し、3文字以上の文字列をegrep
にパイプします。
strings -n 3 -f -t d ./* 2> /dev/null |
egrep '[[:alnum:][:punct:]]*(secret|password|key|credential|http)'\
'[[:alnum:][:punct:]]*$'
"key"を見逃さないように、デフォルトの4文字ではなく3文字が必要です。
サンプルの入力ファイルがないため、/bin/
ディレクトリの最初の10ヒットを示すデモを次に示します。
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