Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Makefile 之禁止 sudo 执行

  虽然很多系统级的操作都需要 sudo,但这是个危险的东西。很多时候我们不该使用它,用了反而会出现一大堆奇奇怪怪的权限问题(因为 sudo 以后写出来的文件都是 root 用户)。甚至要禁止在执行某些命令时的 sudo,并且要给予正确的错误信息告知使用者。
  首先是检测 sudo,其实我一般不去真正检测 sudo,因为这根本没意义。sudo 只是一种通称而已,sudo su 后再去执行命令也一样会出问题。所以我们真正要检测的是当前用户是否有 root 权限。我的做法是检测对根目录是否有写权限来判断,比如这样 [ ! -w / ] || echo fuck sudo   如果当前对 / 目录有写权限则认为是具有 root 权限的。注意不能用 &&,因为 test 会产生一个状态码,会影响 Makefile 执行。或者可以直接用 if 会更易读。
  接下来要做的就是对 root 权限的执行抛出一个错误码不为 0 的执行。因为 Makefile 遇到状态码不为 0 的执行时默认是会停止的。这可以直接 exit 1 之类的方式来主动抛出一个非零状态码。 fucksudo: @[ ! -w / ] || exit 1   但是用户看到的错误信息可能是这样的 make: *** [fucksudo] Error 1   我们应该告诉用户到底出了什么问题。于是可以自己 echo 一个错误提示,比如这样 fucksudo: @[ ! -w / ] || { echo 请不要用 sudo 执行; exit 1; }   然而这么做得到的东西只不过是在先前的错误前多一个提示而已,看起来非常碍眼。有没有办法直接在 Makefile 的错误信息中添加错误描述呢?其实上面的错误信息就是的,虽然现实了一个 fucksudo。也就是说 target 名会被在错误信息中显示。那么我们只要将这个 target 直接命名为错误信息即可,比如这么做: fucksudo = 请不要用\ sudo\ 执行 $(fucksudo): @[ ! -w / ] || exit 1 mytarget: $(fucksudo) @echo OK make: *** [请不要用 sudo 执行] Error 1   把 fucksudo 作为一个依赖来定义,在自己的 mytarget 中依赖它就可以禁止 target 被 sudo 执行了。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^