萧箫 发自 凹非寺 
量子位 报道 | 公众号 QbitAI

想要清理文件夹内部分冗余文件,结果误删了同事刚合的代码?

(例如,在rm -rf /usr/bin/test的/usr后面加了个空格,结果删掉了整个/usr文件)

相比于其他语言,Bash自带许多令人摸不着头脑的设计,其中之一就是变量中间不能加空格。
这就导致Bash在调试时,某些命令具有危险性,例如rm -rf是删除文件夹下所有文件,一旦执行错误,可能会产生爆炸的效果。

现在,手残党的福音来了:GitHub上有一位朋友推出了一款Bash命令的测试框架Bach,助你检测脚本里有没有危险的成分。

 据开发者介绍,这款框架能让你心情平静

只要在测试脚本中导入这款Bach框架,就相当于服下了一剂后悔药,能让你赶紧改掉手残写错的代码提前测试Bash脚本的行为。

这样,便能防止Bash的危险命令执行了错误的参数,从而带来的灾难性后果。

下图是Bach框架中提供的一个名为 @do-not-panic 的 API,将它直接放进含有危险命令的测试方法后,可以避免出现不小心调用的情况。

 有用户指出,这个API的名字非常友好

看起来再也不用删库跑路了。

使用方法也很简单,只需要掌握几个测试实例,就能轻松上手使用这款测试框架。(文末附框架代码)

Bach测试方法

这款测试框架的优势在于,它真的非常小(50kB左右),下载后只要在编写脚本测试前,用source命令导入一下Bach框架中的bach.sh,就能直接使用。

下图是测试含rm -rf这样的危险命令的样例。

图中可见,我们将需要执行的代码部分写在以test-开头的方法中,Bach则会自动寻找与这个测试方法对应的-assert结尾的验证。

 图中是手残的范例,变量抄都抄错了

也就是说,Bach运行两个方法时,会验证两个方法中执行的命令及其参数是否一致(图中显然不一致),如果不一致,测试结果便会失败。

了解了测试脚本的方法,来看看怎么写模拟命令。

用Bach模拟/直接调用命令

在Bach测试框架中,所提供的API都是以@开头的。

其中,有一部分命令可以被模拟(Mock API),另外,如果不得不在测试时直接调用部分命令,Bach中也提供了直接执行这些命令的API。

鉴于command和xargs命令的特殊性,Bach很特别地为这两个命令做了模拟。

在网页的测试说明中,会对这些API进行统一说明。

 API调用说明范例

简单了解后,也许有用户会问,就Unix遗留的某些值得吐槽的设计Bash本身特性而言,已经有不少测试的框架了,Bach到底特殊在哪里?

Bach测试原理

事实上,Bach最特别的地方,在于这是一个真正的Bash单元测试框架

也就是说,Bach可以用于测试Bash中一些非常危险的命令,且不用担心会产生任何后果。

毕竟在Bach中,没有任何在PATH中的命令会被执行,除非明确地指定了路径。

Bach验证的是命令的调用,而非命令的结果,毕竟对于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/bach-testing-framework.test.sh

本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

人类未来20年最重要的航天任务——登陆火星,已经启动!这场征服星辰大海的征程,将彻底改变我们的未来。

什么是火星探索,为什么要远征未来,如何培养科学探索的精神?

中国空间探测技术首席科学传播专家庞之浩,最新推出讲给孩子的火星课《登陆火星》,在其中深入浅出地讲解火星探索史+航天知识,回答了你还不知道的种种好奇疑问。

现在这一精心打磨的课程正在超值预售中,定价99元,目前限时半价,仅49元。让孩子爱上探索宇宙,培养科学思维,现在就开始吧~

给孩子的火星课
限时半价中????

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「在看」吧 !

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

  1. 我删删删删库了,要跑路吗?

    每日英语,每天进步一点点(偷笑): 前言 写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到到实体服务器跑. 结果一跑起来,发生不对劲,怎么一个简单脚本跑了 10  秒还没结束,于是立 ...

  2. “删库跑路”重现江湖,技术和制度如何保障数据安全?

    摘要:近日,一则来自微盟官网的消息在业内引起轩然大波,"删库跑路"重现江湖--由此,关于如何从技术和制度两方面进行数据安全防范的关注和讨论广泛展开. 近日,一则来自微盟官网的消息在 ...

  3. 写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?| 原力计划

    作者 | 小林coding 责编 | 伍杏玲 出品 | CSDN博客 小林在五一节前,想到有 5 天假期,心里开始飘了. 写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到实体服务器跑 ...

  4. 真实版“删库跑路”?程序员蓄意破坏线上生产环境!

    作者 | 阿文 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) 作为程序员经常相互开玩笑说,公司要是把我逼急了,大不了我们"删库跑路",这是一句玩笑话,没想到会 ...

  5. 写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?

    每日英语,每天进步一点点(偷笑): 前言 临近五一节,想到有 5 天假期,小林开始飘了. 写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到到实体服务器跑. 结果一跑起来,发生不对劲, ...

  6. 真实版“删库跑路”?程序员蓄意破坏线上生产环境

    作者 | 阿文 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) 作为程序员经常相互开玩笑说,公司要是把我逼急了,大不了我们"删库跑路",这是一句玩笑话,没想到会 ...

  7. 删库惹的祸,顺丰高级工程师“被跑路”!

    那些年,我们删过的库与跑过的路. 图注:图片源自网络 在 IT 从业者中,有着一群比程序员还要低调且掌管着大数据时代企业生死命门的人,他们就是传说中的 DBA.论起 DBA 的工作职能,很多人表示这可 ...

  8. 从“删库跑路”这件事聊聊数据安全那些事

    最近有个删库跑路的帖子在网上引起热议,很多企业管理者都开始担忧数据库的安全可靠性.其实是数据库安全和备份机制没做到位,如果一开始就采用严密的安全机制和完善的数据库备份机制,那么即便是误删了数据库也可以 ...

  9. 《linux内核中断》之 法外狂徒张三删库跑路

    法外狂徒张三删库跑路 真实案例:在今年2月份,国内一个程序员删库的消息传遍it界.他的几行代码,直接让上市公司微盟的市值一天蒸发超10亿,300百万用户直接受到影响.网上是谣言四起,可谓是最牛逼的删库 ...

最新文章

  1. 大数据分析与可视化报告会成功召开(附PPT下载)
  2. React源码分析与实现(一):组件的初始化与渲染
  3. 伍迷创意随想集 之 网游与旅游结合新玩法
  4. Latex字体加粗命令备忘
  5. 转:Siri之父:语音交互或将主导未来十年发展
  6. ZPan私人网盘 v1.4.1
  7. Spring MVC之cookies跟session 数据绑定
  8. JavaScript 事件相关
  9. Brute Force(暴力算法)
  10. matlab如何预测数据,matlab预测数据
  11. BI系统是如何进行数据分析的?
  12. xp计算机u盘重装系统,xp系统怎么安装,小编教你利用u盘安装xp系统的方法
  13. 关于百度地图海量打点的问题
  14. 解决git clone fatal: port 443: Timed out
  15. mime类型总结 input_type=file限制
  16. HTML基础跟着李南江学编程
  17. 帝国php调用文章列表,帝国cms教程内容页面调用当前会员信息和文章数量以及文章列表...
  18. 万能PDF转换迅捷PDF转换成Word转换器评测
  19. 24小时365天不间断服务
  20. win7用linux脚本文件怎么打开,win7下通过ShellExecute调用记事本

热门文章

  1. Redis Lua脚本中学教程(下)
  2. Spark Streaming--实战篇
  3. 创建型设计模式对比总结 设计模式(八)
  4. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点...
  5. oc09--NSString
  6. Linq-ToList与ToArray
  7. 随笔-tomcat的日志文件按日期每天生成
  8. 关于ZIP大文件压缩
  9. WINCE5 s3c2440_SD驱动知识补充
  10. JavaScript实用的一些技巧