如何在shell脚本中最简单地确保其不以root身份运行?

10

我有一个Java应用程序,通过一个([ba]sh) shell脚本执行,不幸的是,有时候负责部署和启动它的人在启动应用程序之前没有切换到适当的用户。在这种情况下,我希望应用程序至少不能运行,并最好发出警告。我考虑过尝试别名化java或更改root的路径以包含一个假的java来实现,但这可能会产生不良副作用,并且由于shell脚本指定了java二进制文件的完整路径,因此不容易实现。

因此,Shell脚本中是否有“如果我是root,则不要运行”的标准习语?


请指明使用的shell是哪种?BASH shell,CMD shell? - Nate Zaugg
3
抱歉,我并不把CMD shell脚本看作是shell脚本,更多的是视为“批处理文件”,所以我没有意识到需要区分两者。 - Jherico
2
Bash有$EUID,但Cristis在下面提供了可移植的答案。 - msw
3个回答

13

在bash中的示例:

if [ `id -u` = 0 ]; then
  echo "You are root, go away!"
  exit 1
fi

1

我在想要在服务账户下运行的脚本开头使用类似这样的东西:

LUSER='my-service'
if [ `id -un` != $LUSER ]; then
    exec su  $LUSER -s $SHELL -c "$0 $@"
fi

# actual script commands here.

如果以正确的用户身份运行,则执行将按计划继续。如果以root身份运行,则特权将降级为所需的用户ID。其他用户将收到密码提示,告诉他们出现了问题。

su -s $SHELL ...用于覆盖/etc/passwrd中设置的shell -- 它可能被设置为服务帐户的/bin/false

我在Debian系统上使用了这个方法,使用了bashdash。如果可移植性可以改进,请随时发表评论。


嗯,我认为没有特定的用户会部署和运行Java应用程序...重要的是它不是root。 - cristis
id -u 给出的是一个数字而不是一个名称。你可能想要使用 id -un。 - Fred Nurk

1
在BASH中,您可以获取whoami的输出并将其与root进行比较。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接