如何测试Shell脚本的文件处理健壮性?


Answers:


11

创建一个单独的目录进行播放(主要是为了便于以后清理);它使用$TMPDIRif 的值设置,否则/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

以上归功于Patrick。这两个十六进制代码是UTF-8空格分隔符,称为螺母羊肉;“在双向上下文中,它充当空白并且没有镜像。在某些情况下,该字形可以与其他20个字形混淆。”

创建一个普通文件,如果将其视为全局文件,则将其扩展到第一个文件:

touch -- x '[x]' 

以上归功于Wumpus Q. Wumbley

与此相类似:

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

在此处的评论中,将以上内容归功于dave_thompson_085

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

以上归功于Godlygeek

如果在shell上下文中进行评估,则文件名将扩展为不同的名称(可能任意执行!):

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)

更多杂项文件名。最后两个是“小数斜杠”和“除法斜杠”的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?ba*b(报价当然)。@muru:字节序列E2 80 82/83是U + 2002 EN SPACE和U + 2003 EM SPACE的UTF-8编码
dave_thompson_085

一些邪恶的天才在那儿工作:-c
user207673

可能会很有趣,-并且--,尽管根据脚本的要求,在没有前导的情况下可能无法访问它们./。我很惊讶,也有非水珠shell特殊字符等几种,像;&|<>$(){}=\!,和#-例如,{a,b}
斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.