我有一个Java应用程序,通过一个([ba]sh) shell脚本执行,不幸的是,有时候负责部署和启动它的人在启动应用程序之前没有切换到适当的用户。在这种情况下,我希望应用程序至少不能运行,并最好发出警告。我考虑过尝试别名化java或更改root的路径以包含一个假的java来实现,但这可能会产生不良副作用,并且由于shell脚本指定了java二进制文件的完整路径,因此不容易实现。
因此,Shell脚本中是否有“如果我是root,则不要运行”的标准习语?
在bash中的示例:
if [ `id -u` = 0 ]; then
echo "You are root, go away!"
exit 1
fi
我在想要在服务账户下运行的脚本开头使用类似这样的东西:
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系统上使用了这个方法,使用了bash
和dash
。如果可移植性可以改进,请随时发表评论。
$EUID
,但Cristis在下面提供了可移植的答案。 - msw