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

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

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

我怎样才能最好地(干净和安全地)完成这个任务呢?谢谢!

啊,只是澄清一下:(做东西)部分将涉及运行本身需要root的命令。因此,作为一个普通用户运行它只会出现一个错误。这只是为了干净地运行一个需要根命令的脚本,而不需要在脚本中使用sudo,我只是在寻找一些语法糖。


当前回答

有一个简单的检查用户是否为root。

# Fancy red-colored `error` function with `stderr` redirection with `exit`.
error ()
{
    { printf '\E[31m'; echo "$@"; printf '\E[0m'; } >&2
    exit 1
}

# Test for root user.
if [ "$EUID" -eq 0 ]; then
    error "Do not run this as the root user"
fi

这还假设如果失败,您希望以1退出。error函数是一种将输出文本设置为红色的功能(不需要,但如果你问我的话,我觉得这很不错)。

其他回答

如果脚本确实需要根访问权限,那么它的文件权限应该反映这一点。非根用户可执行根脚本将是一个危险信号。我建议您不要使用if检查来控制访问。

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

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

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

注意:如果你得到2:[:非法数字:检查你是否有#!将/bin/sh改为#!/bin/bash。

1-阅读官方的GNU Linux文档,有很多正确的方法。

2-确保你把shell签名,以避免错误解释:

#!/bin/bash

3-这是我的剧本

#!/bin/bash 

if [[ $EUID > 0 ]]; then  
  echo "Please run as root/sudo"
  exit 1
else
  #do your stuff
fi

在Bash中,我的观点是:

#!/bin/bash

# Display the UID variable
echo "Your UID is $UID"

# Check for root user via UID
if [ "$UID" -eq 0 ]; then
    echo "You are root"
else
    echo "You are not root user" >&2
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更好的方法,因为$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运行。

如果您的脚本总是由根用户运行,只需相应地设置权限(0500)。