如何阻止root运行脚本


10

Glassfish的应用服务器提供了脚本来管理应用程序服务器,并启动和停止他们,我想从运行此脚本限制root用户。原因是某些主要开发人员忘记以非特权用户身份管理服务器,并且如果他们以root用户身份重新启动应用程序服务器,则应用程序服务器必须由root用户[*]运行。

避免授予root用户访问权限是一种选择,开发人员会忘记,因为他们习惯在本地计算机上执行此操作。我希望该asadmin脚本可以更改为以非特权用户身份运行,或者可以选择在每次由root用户运行脚本时显示一条错误消息。

使用Bash外壳。

[*]:我试图修复文件的权限,但是即使我跟踪了许多由root拥有并对其进行chmod的文件,该应用程序也会遇到奇怪的错误,因此我必须再次以root身份运行。

Answers:


18

与其他答案类似,但在您想要的方向上。

if [[ $EUID -eq 0 ]]; then
  echo "This script must NOT be run as root" 1>&2
  exit 1
fi

或者,您可以sudo在脚本中使用来强制执行非特权用户,方法是使用该-u标志指定要作为其运行的用户。我不使用Glassfish,但这是一个原始示例伪脚本。

#!/bin/bash

if [ $1 == "start" ]; then
  sudo -u nobody /usr/bin/glassfish
fi

希望你能明白。抱歉,我真的不知道脚本是什么样子,或者非特权用户的名字。


2

@Tshepang有正确的想法。我不知道哪个是最可移植的,但是这里有其他方法可以检测用户是否是root用户:

id -u
$UID

另外,您可以简单地强制它以相同的参数作为另一个用户运行:

if [[ "$USER" != appuser ]]
then
    exec sudo -u appuser "$0" "$@"
fi

1
这是落后的。他希望root用户不要运行该脚本。
bahamat 2011年

德,忘了sudo一点。现在它应该做的工作。
l0b0 2011年

@TobySpeight否,如果用户是root用户,脚本将不执行任何操作。我相信您的更改还会导致一个额外的参数(如果$@为空),并且我将其更改为使用在其他地方找到的模式。
l0b0

谢谢@TobySpeight,已修改。我确定我会在某处看到该表格,以确保正确传递零参数。还修复了检查,该检查肯定有一个错误(它不是叉子炸弹,但会无限期地自称其
名字

我认为这是一枚分叉炸弹,因为每个实例都会为sudo(不使用exec)分叉一个新的外壳,而父实例会等待它,因此最终将得到一个完整的进程表。仍然值得把它放在exec那里(如果您不希望之后的代码fi以错误的用户身份运行)。
Toby Speight
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.