如何检查在bash脚本中以root身份运行

我正在编写一个需要根级别权限的脚本,我想这样做,如果脚本不以root身份运行,它只会回应“请以root身份运行”。 并退出。

以下是我正在寻找的一些伪代码:

if (whoami != root) then echo "Please run as root" else (do stuff) fi exit 

我怎么能最好(干净,安全)完成这个? 谢谢!

嗯,只是为了澄清:(做东西)部分将涉及运行命令,本身需要根。 所以像普通用户一样运行就会出错。 这只是为了干净地运行需要root命令的脚本,而不是在脚本中使用sudo,我只是在寻找一些语法糖。

$ EUID环境variables保存当前用户的UID。 Root的UID是0.在你的脚本中使用这样的东西:

 if [ "$EUID" -ne 0 ] then echo "Please run as root" exit fi 

在一个bash脚本中,你有几种方法来检查正在运行的用户是否是root用户。

作为警告 ,请不要使用root用户名来检查用户是否为root用户。 没有什么能保证ID为0的用户被称为root 。 这是一个非常强大的惯例,广泛遵循,但任何人都可以重命名超级用户的另一个名字。

我认为使用bash的最好方法是使用$EUID ,从手册页:

 EUID Expands to the effective user ID of the current user, initialized at shell startup. This variable is readonly. 

这是比$UID更好的方法,可以改变它,而不是反映真正的用户运行脚本。

 if (( $EUID != 0 )); then echo "Please run as root" exit fi 

我遇到这种问题的一种方式是在不以root身份运行时在我的命令中注入sudo 。 这里是一个例子:

 SUDO='' if (( $EUID != 0 )); then SUDO='sudo' fi $SUDO a_command 

这样,我的命令在使用超级用户时由root运行,或者在由普通用户运行时由sudo运行。

如果您的脚本总是以root身份运行,只需简单地设置权限( 0500 )即可。

正如@wrikken在他的评论中提到的, id -u是一个更好的根检查。

另外,正确使用sudo ,你可以检查脚本是否以root身份运行。 如果没有,请通过sudo重新启动,然后使用root权限运行。

根据脚本的作用,另一个选项可能是为脚本可能需要的任何专门命令设置一个sudo条目。

 if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi 

要么

 if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi 

🙂

已经给出了一些答案,但似乎最好的方法是使用:

  • id -u
  • 如果以超级用户身份运行,将返回一个0。

这似乎比其他方法更可靠,而且即使脚本通过sudo运行,它似乎也会返回一个0的ID。

有一个简单的检查用户是根。

[[ stuff ]]语法是在bash中运行检查的标准方法。

 error() { printf '\E[31m'; echo "$@"; printf '\E[0m' } if [[ $EUID -eq 0 ]]; then error "This script should not be run using sudo or as the root user" exit 1 fi 

这也假设你想退出1,如果你失败。 error函数是一些天赋,将输出文本设置为红色(不需要,但是如果你问我,就很漂亮)。

如果脚本确实需要root权限,那么它的文件权限应该反映出来。 有一个非root用户可以执行的root脚本将是一个红旗。 我鼓励你不要用if检查来控制访问。

 chown root:root script.sh chmod u=rwx,go=r script.sh 

非常简单的方法就是:

 if [ "$(whoami)" == "root" ] ; then # you are root else # you are not root fi 

使用这个而不是id的好处是你可以检查某个非root用户是否也在运行这个命令。 例如。

 if [ "$(whoami)" == "john" ] ; then # you are john else # you are not john fi 

尝试下面的代码:

 if [ "$(id -u)" != "0" ]; then echo "Sorry, you are not root." exit 1 fi 

要么

 if [ `id -u` != "0" ]; then echo "Sorry, you are not root." exit 1 fi 

0-阅读官方的GNU Linux文档,有很多方法可以正确地做到这一点。

1-确保你把shell签名,以避免在解释中的错误:

  #!/bin/bash 

这是我的剧本

 #!/bin/bash if [[ $EUID > 0 ]]; then # we can compare directly with this syntax. echo "Please run as root/sudo" exit 1 else #do your stuff fi 

id -uwhoami好得多,因为像android这样的系统可能不会提供root这个词。

例:

 # whoami whoami whoami: unknown uid 0 

检查根目录,如果失败则退出:

  func_check_for_root() { if [ ! $( id -u ) -eq 0 ]; then echo "ERROR: $0 Must be run as root, Script terminating" ;exit 7 fi } func_check_for_root 

然后还有whoami和'我是谁',如果你想知道谁在脚本谁正在运行一个脚本:

  it@it-ThinkPad-W510:~$ who am i it pts/19 2014-06-03 12:39 (:0.0) it@it-ThinkPad-W510:~$ sudo who am i [sudo] password for it: it pts/19 2014-06-03 12:39 (:0.0) 

(请参阅即使使用sudo调用它给用户id)

  it@it-ThinkPad-W510:~$ sudo whoami root 

因此,

  if [ "$(whoami)" == "user" ]; then echo "Executing the installer script" else echo "user is only allowed to execute the installer script" fi 

使脚本只能以root运行的一种简单方法是使用以下行来启动脚本:
#!/bin/su root