当前位置: 首页 > 科技观察

防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知

时间:2023-03-21 17:21:02 科技观察

为了防止删库的悲剧,这里提供一个Bash脚本测试框架,一旦测试就可以检测出危险代码。想清理文件夹中一些多余的文件,却不小心把同事刚刚加入的代码删掉了?(比如rm-rf/usr/bin/test在/usr后面加一个空格后,整个/usr文件被删除)和其他语言相比,Bash有很多令人困惑的设计,其中一个就是空格不能被删除在变量之间添加。这会导致某些命令在Bash调试时很危险。例如,rm-rf删除文件夹中的所有文件。一旦执行不当,可能会造成爆炸效果。现在,手残党的福音来了:GitHub上有朋友推出了一个Bach命令测试框架Bach,帮你检测脚本中是否存在危险组件。根据开发者的说法,这个框架能让你心平气和。只要在测试脚本中导入这个Bach框架就相当于吃了一剂后悔药,可以让你快速修正手头磨损的代码,提前测试Bash脚本。的行为。这样就可以避免危险的Bash命令执行错误的参数,导致灾难性的后果。下图是Bach框架中提供的一个名为@do-not-panic的API。直接放入包含危险命令的测试方法后,可以避免误调用。有用户指出,这个API的名字很亲切,似乎没有必要删库跑路。使用方法也很简单。你只需要掌握几个测试用例就可以开始使用这个测试框架。(文末附框架代码)Bach测试方法这个测试框架的优点是真的很小(50kB左右)。下载后,在编写脚本测试之前,只需使用source命令导入Bach框架中的bach.sh即可。可以直接使用。下图是测试rm-rf等危险命令的例子。从图中可以看出,我们把需要执行的部分代码写在test-开头的方法中,Bach会自动找到以-assert结尾的test方法对应的验证。图片是一个盘口的例子,变量都复制错了。也就是说,Bach在运行这两种方法时,会验证两种方法中执行的命令和参数是否一致(图中明显不一致)。如果不一致,测试结果就会失败。知道了如何测试脚本,下面我们来看看如何编写模拟命令。使用Bach模拟/直接调用命令在Bach测试框架中,提供的API都是以@开头的。其中,可以模拟一些命令(MockAPI)。另外,如果你在测试的时候不得不直接调用一些命令,Bach也提供了一个API来直接执行这些命令。鉴于command和xargs命令的特殊性,巴赫特地对这两个命令进行了模拟。在网页的测试描述中,会统一描述这些API。简单了解了API调用描述示例后,可能会有用户问,Bash的一些Unix遗留下来值得吐槽的设计特点,已经有很多测试框架了。巴赫有什么特别之处?Bach测试原理其实Bach最特别的地方在于它是一个真正的Bash单元测试框架。也就是说,Bach可用于在Bash中测试一些非常危险的命令,而不用担心任何后果。毕竟,在Bach中,除非明确指定路径,否则不会执行PATH中的任何命令。巴赫验证的是命令的调用,而不是命令的结果。毕竟对于Shell脚本来说,最重要的是验证命令的调用是否传入了预期的参数或选项。这个Bach测试框架和目前其他测试框架(如Bats、Shunit2等)的区别在于,后者实际上会调用系统PATH中的命令,但Bach是绝对安全的。因此,即使是初学者也可以放心地使用Bach来练习Bash编程,而不用担心任何误操作。网页中的代码有非常友好和详细的注释,听起来像是Bash的完美补丁。当然,Bach目前还是有局限性的,比如不能阻止直接使用绝对路径的命令调用,也不能阻止I/O重定向等。不过这个测试框架还在持续更新中,目前正在使用中宝马集团和华为。感兴趣的朋友可以期待它的后续,或者一起成为Bach框架的代码贡献者。作者介绍柴峰,一名拥有15年编码经验的软件开发工程师,熟悉Unix/Linux系统、IT运维、自动化测试和持续交付。传送门bach测试框架地址https://github.com/bach-sh/bach/blob/master/README-cn.md测试实例https://github.com/bach-sh/bach/blob/master/tests/巴赫-测试-framework.test.sh