Bagaimana saya bisa menguji ketahanan penanganan skrip file shell saya?

11

Saya telah menulis skrip shell yang menangani beberapa nama file "biasa", tetapi saya telah membaca Mengapa skrip shell saya tersedak di spasi putih atau karakter khusus lainnya? dan Mengapa Anda tidak harus menguraikan output ls dan saya ingin itu lebih kuat dan menangani nama file yang valid (dan / atau nama direktori). Bagaimana saya bisa membuat test-bed file dan direktori untuk menjalankan skrip saya?

Jeff Schaller
sumber

Jawaban:

11

Buat direktori terpisah untuk dimainkan (terutama untuk memudahkan pembersihan nanti); ini menggunakan nilai $TMPDIRjika disetel, jika tidak /tmp:

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

Buat file yang terpisah, tetapi tampak mirip satu sama lain karena spasi putih (spasi, tab, baris baru, carriage return, backspace):

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

Penghargaan untuk yang di atas untuk Patrick . Kedua kode hex tersebut adalah pemisah ruang UTF-8 yang dikenal sebagai mur dan kambing ; "Dalam konteks dua arah, ia bertindak sebagai White Space dan tidak dicerminkan. Mesin terbang, dalam keadaan, dapat dikacaukan dengan 20 mesin terbang lainnya."

Buat file biasa dan yang akan diperluas ke yang pertama jika diperlakukan sebagai bola:

touch -- x '[x]' 

Penghargaan untuk yang di atas untuk Wumpus Q. Wumbley .

Dalam nada yang sama:

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

Kredit untuk yang di atas ke dave_thompson_085 di komentar di sini.

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

Penghargaan untuk yang di atas untuk godlygeek .

Nama file yang akan diperluas ke sesuatu yang berbeda (dan berpotensi eksekusi sewenang-wenang!) Jika dievaluasi dalam konteks shell:

touch '$( echo boom )'

Menggunakan:

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

untuk menangkap upaya untuk memasukkan nama file dalam tanda kutip tanpa lolos tanda kutip.

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

Penghargaan untuk yang di atas untuk Stéphane Chazelas .

Buat pipa bernama dan symlink (untuk membuat file yang tidak "biasa"):

mkfifo fifo
ln -s a alink

Buat subdirektori yang memiliki beragam spasi putih yang disertakan dalam namanya, bersama dengan file token di dalamnya:

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

Buat hanya nama file yang berisi *(mungkin bermasalah untuk dihapus), nama file yang hanya terdiri dari ruang (reguler!), Tautan simbolik mati, tautan simbolik yang dilingkarkan ke dirinya sendiri, dan sub-direktori dengan tautan kembali ke direktori induk:

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

ln -s /does/not/exist dead

ln -s loop loop

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

Lebih banyak nama file misc. Dua yang terakhir adalah unicode untuk "slash fraksional" dan "slash pembagian".

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

Gagasan dari Scott :

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

Karakter yang tidak berbahaya di beberapa lokal tetapi berbahaya di yang lain:

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

Karakter yang mengurutkan sama di beberapa lokal:

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

File yang lolos dari .[!.]* *glob (terkadang digunakan untuk membuka file yang disembunyikan dan tidak disembunyikan):

touch ..foo ...
Jeff Schaller
sumber
ironi dari komentar "komentar" mengganggu; apakah Anda mengatakan untuk menambahkan penjelasan untuk apa yang dilakukan berbagai perintah?
Jeff Schaller
1
ya, tolong jelaskan kasus uji yang paling Anda buat jelas, beberapa seperti yang terlihat seperti karakter Unicode di dalamnya, tidak.
muru
1
Saya akan menambahkan a?bdan a*b(dikutip tentu saja). @muru: byte sequence E2 80 82/83 adalah pengkodean UTF-8 dari U + 2002 EN SPACE dan U + 2003 EM SPACE
dave_thompson_085
Beberapa genius jahat bekerja di sana: -c
user207673
Mungkin menarik untuk dimainkan -dan --, meskipun, tergantung pada persyaratan skrip, mungkin tidak mungkin untuk mengaksesnya tanpa arahan ./. Dan aku terkejut bahwa ada begitu sedikit dengan non-gumpal karakter shell khusus, seperti ;, &, |, <, >, $, (, ), {, }, =, \, !, dan #- misalnya, {a,b}.
Scott