web-dev-qa-db-ja.com

bashスクリプトで、ユーザー入力をサニタイズするにはどうすればよいですか?

簡単な入力を取るための最良の方法を探しています。

echo -n "Enter a string here: "
read -e STRING

英数字以外の文字、小文字(大文字)を削除し、スペースをアンダースコアに置き換えることでクリーンアップします。

順序は重要ですか? trはこれに対処するための最善の/唯一の方法ですか?

43
Devin Reams

Dj_segfaultが指摘しているように、シェルはこれのほとんどを行うことができます。ただし、文字列を小文字にする場合は、外部のものに頼る必要があるようです。このためには、上記のPerlの1行など、多くのオプションがありますが、おそらくtrが最も簡単だと思います。

# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`

ここでの順序は多少重要です。アンダースコアを削除し、スペースをアンダースコアに置き換えたいので、最初にアンダースコアを削除する必要があります。最後までtrに渡すのを待つことで、英数字とアンダースコアしかなく、スペースがないことを確認できるので、シェルによって特殊文字が解釈されることを心配する必要はありません。

44
Thomee

Bashはこれをすべて自分で行うことができます。ありがとうございました。 Parameter Expansionのmanページのセクションを見ると、そのbashに置換、サブストリング、トリム、rtrimなどが組み込まれていることがわかります。

英数字以外の文字をすべて削除するには、次のようにします。

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

That's Occamのかみそり。別のプロセスを起動する必要はありません。

34
dj_segfault

素早く汚い:

STRING=`echo 'dit /ZOU/ een test123' | Perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

1
Thomas

Perlで実行できます。

export CLEANSTRING=$(Perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

ここではkshスタイルのサブシェルを使用していますが、bashで機能するかどうかは完全にはわかりません。

シェルのいいところは、Perl、awk、sed、grepなどを使用できることです。

1
Axeman

Bash> = 4.の場合:

CLEAN="${STRING//_/}" && \
CLEAN="${CLEAN// /_}" && \
CLEAN="${CLEAN//[^a-zA-Z0-9]/}" && \
CLEAN="${CLEAN,,}"

これは、docker/podmanを使用してプログラムでコンテナー名を作成する場合に特に便利です。ただし、この場合はアンダースコアも削除する必要があります。

# Sanitize $STRING for a container name
CLEAN="${STRING//[^a-zA-Z0-9]/}" && \
CLEAN="${CLEAN,,}"
0

少し見回した後、trは確かに最も簡単な方法のようです。

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

オッカムのかみそり 、私はそう思います。

0
Devin Reams