在 Phing 中检测 Sudo 用户
我将Phing用于许多不同的任务,它帮助我自动化那些如果留给我自己的设备我会搞砸的事情。Phing脚本的主要候选对象是那些我不太会做并且忘记如何做的事情,或者有许多复杂步骤的事情。我发现的唯一问题是,因为我创建的许多Phing脚本依赖于系统更改(例如,配置Apache服务器),因此它们需要系统更改权限。通常我只会在Phing命令前加上sudo,但我时不时会忘记这一步,构建失败。这可能很危险,因为我的构建失败了,这可能会导致系统部分配置甚至使服务器脱机。
这让我开始思考Phing可以做些什么来提醒我,如果我忘记在需要脚本的sudo上使用sudo。必须有更好的方法来提醒自己,我应该以sudo身份运行脚本,而不仅仅是让构建失败。在浏览了Phing文档并在网上进行了一些搜索后,我没有发现任何可以做到这一点的内容。
Twitter上的@phingofficial频道(顺便说一句,他们很棒)建议我可以使用“whoami”或“id-u”的输出来测试用户是否以sudo身份运行。这很容易使用
下面将属性“currentuser”设置为“whoami”命令的输出。如果脚本以sudo身份运行,那么这将是“root”,否则它将是当前用户的用户名。
下面将属性“currentuser”设置为“id-u”命令的输出。如果脚本作为sudo运行,那么这将是“0”,否则它将是当前用户的ID(在我的本地主机上为1000)。
如果您使用的是Windows,那么您可能能够使用以下命令,如果用户不是管理员,它将产生访问被拒绝的消息。如果您对如何通过命令行(甚至通过PHP)检测Windows上的管理员用户有任何其他建议,那么我很高兴收到您的来信。
有了这个,我可以使用该属性创建一个布尔值,稍后我可以在脚本中使用
或者,我可以只是一个
这
如果在那里,我本可以离开,但我想通过创建一个自定义Phing任务来进一步发展,该任务将创建一个名为“issudo”的属性,该属性将告诉我用户是否已使用sudo运行构建脚本。这涉及创建一个使用PHP检查sudo状态的PHP类,因此它应该适用于任何平台。要与Phing集成,您只需要创建一个扩展Task的类并实现一个名为main().该main()方法在使用对象时执行,因此需要在该方法中完成检查用户和创建属性的工作。
在Linux主机上查看用户是否使用sudo运行了PHP脚本非常容易。$_SERVER数组将包含一些与原始用户是谁以及在命令行上使用时运行的命令有关的元素。如果我们在$_SERVER数组中查找SUDO_COMMAND的存在,那么我们可以非常确定用户正在以sudo用户身份运行脚本。同样,如果您有更多关于它如何在Windows上工作的信息,我很高兴收到您的来信。
要设置可在Phing构建文件中使用的属性,需要调用$this->project->setProperty()方法。这将创建一个具有给定名称的属性并采用两个参数。
$name:要设置的属性名称。
$value:财产的价值。如果属性名称已经存在,那么这将覆盖先前的值。
下面的类被放置在与我的构建脚本相同的目录中,名为IsSudo.php。调用log()只是向终端打印一条消息,以便我们可以看到该类已运行。
/** * Sets a phing property called 'issudo' that can be used to see if the user has root privilages. * */ class IsSudo extends Task { /** * Set the property. */ public function main() { $issudo = false; $this->log('Determining sudo.'); if (isset($_SERVER['SUDO_COMMAND'])) { $issudo = true; } $this->project->setProperty('issudo', $issudo); } }
这里的最后一步是告诉Phing我们有一个要使用的类。这是使用
这允许我们使用自定义issudo任务创建一个名为${issudo}的属性,然后可以使用它来查看用户是否以sudo身份运行脚本。
这按预期工作,如果我忘记通过sudo运行它,它将停止执行构建文件。
我确实认为有可能与Phing中的比较运算符集成并创建一个元素,其工作方式与
更新:Twitter上的@Beryllium9建议强制执行sudo检查的一个好方法是创建单个sudo目标,然后将其作为运行任何需要sudo的目标的先决条件。这样做的方法是使用目标元素的depends属性。添加依赖属性的目标元素会让Phing运行指定的目标第一次运行当前之前的目标。即使正在调用默认目标,情况也是如此。
例如,如果使用sudo运行,以下构建文件将仅运行主目标。
Running main target