シェルスクリプトのファイル処理の堅牢性をテストするにはどうすればよいですか?


11

一部の「通常の」ファイル名を処理するシェルスクリプトを作成しましたが、「シェルスクリプトが空白やその他の特殊文字で詰まるのはなぜですか?」を読みましたそしてなぜあなたはLSの出力を解析べきではないと私はそれがより堅牢でかつ有効な任意のファイル名(および/またはディレクトリ名)を処理したいと思います。スクリプトを実行するファイルとディレクトリのテストベッドを作成するにはどうすればよいですか?

回答:


11

再生する別のディレクトリを作成します(主に後でクリーンアップを簡単にするため)。これは、$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進コードの1つは、nutおよびmuttonとして知られるUTF-8スペースセパレーターです。「双方向のコンテキストでは、ホワイトスペースとして機能し、ミラーリングされません。グリフは、状況によっては、他の20個のグリフと混同される可能性があります。」

プレーンファイルと、それがグロブとして扱われた場合に最初に展開されるファイルを作成します。

touch -- x '[x]' 

Wumpus Q. Wumbleyへの上記のクレジット。

同じような調子で:

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

ここのコメントで上記のdave_thompson_085へのクレジット。

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

godlygeekへの上記のクレジット。

シェルコンテキストで評価された場合に別の何かに(そして潜在的に任意の実行に!)展開するファイル名:

touch '$( echo boom )'

使用する:

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

引用符をエスケープせずにファイル名を引用符で囲む試みをキャッチする。

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

上記のクレジットはStéphaneChazelasに帰属します。

名前付きパイプとシンボリックリンクを作成します(「通常」ではないファイルを作成します):

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つは、「フラクショナルスラッシュ」と「ディビジョンスラッシュ」の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.

.[!.]* *グロブをエスケープするファイル(隠しファイルと非隠しファイルの両方を展開するために使用される場合があります):

touch ..foo ...

「コメント」コメントの皮肉は気を散らすものです。さまざまなコマンドが何をしているかについての説明を追加するために言っていますか
ジェフシャラー

1
はい、作成しているテストケースの中で最も明らかなテストケースを説明してください。その中には、Unicode文字のように見えるものもあれば、そうでないものもあります。
muru

1
私は追加a?bしますa*b(もちろん引用されます)。@muru:バイトシーケンスE2 80 82/83は、U + 2002 EN SPACEおよびU + 2003 EM SPACEのUTF-8エンコーディングです
dave_thompson_085

そこに働いているいくつかの邪悪な天才:-c
user207673

と遊ぶのも面白いかもしれません-し、--スクリプトの要件に応じて、多分招くことなく、それらにアクセスすることは不可能である必要があり、にもかかわらず、./。そして、私はのような、非グロブシェルの特殊文字と非常に少ないがあることを驚いている;&|<>$(){}=\!、および#、例えば- {a,b}
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.