3

スクリプトに指定された最初の用語がファイル「file.txt」にあるかどうかを確認するために、「isinFile.sh」という小さな bash スクリプトを作成しました。

#!/bin/bash

FILE="file.txt"

if [ `grep -w "$1" $FILE` ]; then 
 echo "true"
else
 echo "false"
fi

ただし、次のようにスクリプトを実行します

> ./isinFile.sh -x

によってオプションとして-x解釈されるため、スクリプトを中断します。grepだから私は自分のスクリプトを改善しました

#!/bin/bash

FILE="file.txt"

if [ `grep -w -- "$1" $FILE` ]; then 
 echo "true"
else
 echo "false"
fi

--grep の引数として使用します。現在実行中

> ./isinFile.sh -x
false

動作します。しかし--、bash スクリプトでコード/オプションのインジェクションを防ぐための正しい唯一の方法を使用していますか? 実際に見たことはありませんが、ABASH: Finding Bugs in Bash Scriptsで言及されているだけです。

4

3 に答える 3

2

実際には、このスクリプトには別のコード インジェクション (またはあなたがそれを呼びたいもの) のバグがあります。これは単に出力を (aka ) コマンドに渡し、grepそれ[test空でない場合は true を返すと想定します。ただし、出力が複数の「単語」の長さである場合は、[それを式として扱い、評価を試みます。たとえば、ファイルに次の行が含まれている0 -eq 2とします。「0」を検索[すると、0 は 2 と等しくないと判断され、一致が見つかったにもかかわらず、スクリプトは false を出力します。

これを修正する最善の方法は、Ignacio Vazquez-Abrams の提案を使用することです (Dennis Williamson によって明らかにされています-q) grep。そのオプションが利用できない場合、別の方法は、出力を二重引用符で保護することです: if [ "$(grep -w -- "$1" "$FILE")" ]; then(逆引用符の代わりに $() も使用したことに注意してください。空白のような面白いものが含まれている場合)。

于 2010-06-11T03:07:25.003 に答える
2
grep -w -- ...

続くものでその解釈を妨げます --

編集

(最後の部分を読んでいませんでした)。はい、それが唯一の方法です。もう 1 つの方法は、検索の最初の部分としてそれを避けることです。たとえば".{0}-x"、あまりにもうまくいきますが、それは奇妙です。

grep -w ".{0}$1" ...

も動作するはずです。

于 2010-06-10T08:48:42.670 に答える
1

この特定のケースには適用できませんが、別の手法を使用して、ハイフンで始まるファイル名がオプションとして解釈されないようにすることができます。

rm ./-x

また

rm /path/to/-x
于 2010-06-10T12:53:25.697 に答える