シェルスクリプトのファイル処理の堅牢性をテストする方法は?

シェルスクリプトのファイル処理の堅牢性をテストする方法は?

私はいくつかの「一般的な」ファイル名を処理するシェルスクリプトを書いたが、次の内容を読んだ。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?そしてlsの出力を解析しない理由私はそれがより強力で有効なファイル名(および/またはディレクトリ名)を処理したいと思います。スクリプトを実行するためにファイルとディレクトリのテストベンチをどのように生成しますか?

ベストアンサー1

再生する別のディレクトリを作成します(主に後で簡単に整理できるように)。$TMPDIR設定した場合は値を使用し、そうでない場合は次のようにします/tmp

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

空白(スペース、タブ、改行、キャリッジリターン、バックスペース)のために互いに似ている別々のファイルを作成します。

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

上記は次のとおりです。パトリック。 2つの16進コードはUTF-8スペース区切り記号です。ナットそして子羊; 「双方向のコンテキストでは空白として機能し、ミラー化されません。場合によっては、20文字の他の文字と混同される可能性があります。」

通常のファイルとglobとして扱われる場合は、最初のファイルに展開されるファイルを作成します。

touch -- x '[x]' 

上記は次のとおりです。こんなQ.ウェンブリー

これに似ています:

touch -- 'a?b' 'a*b'

上記は次のとおりです。デイブ・トンプソン_085ここのコメントに。

touch -- foo\`echo\ malicious\`bar

上記は次のとおりです。シェンケ

シェルのコンテキストで評価されると、ファイル名は別の名前に拡張されます(潜在的にランダムに実行可能です)。

touch '$( echo boom )'

使用:

touch -- single\'quote double\"quote back\\slash

Catchは引用符をエスケープせずに引用符の中にファイル名を入れようとします。

touch -- -a -b -c -r -R - a=x

上記は次のとおりです。スティーブン・チャジェラス

名前付きパイプとシンボリックリンクを作成します(非「一般」ファイルを作成するため):

mkfifo fifo
ln -s a alink

名前にさまざまなスペースを含むサブディレクトリとその中にトークンファイルを作成します。

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

*(一般!)スペース、デッドシンボリックリンク、独自の繰り返しシンボリックリンク、および親ディレクトリに戻るリンクのみを含む(削除することが問題になる可能性があります)、ファイル名のみを含むサブディレクトリを作成します。

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

その他のファイル名。最後の2つは、「10進スラッシュ」と「除算スラッシュ」のUnicodeです。

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

アイデアは以下から出てくるスコット:

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

ある地域では無害ですが、他の地域では危険なキャラクター:

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

一部のロケールで同じ文字を並べ替えます。

touch ① ② # sorts the same in GNU locales, order non-deterministic.

globをエスケープするファイル.[!.]* *(時々隠されたファイルと隠されていないファイルを拡張するために使用されます):

touch ..foo ...

おすすめ記事