如何检查用户在 bash 脚本中是否具有 sudo 权限?

How to check if user has sudo privileges inside the bash script?

提问人:Andrius Solopovas 提问时间:11/16/2020 最后编辑:Andrius Solopovas 更新时间:11/18/2023 访问量:2027

问:

我想检查用户是否具有 sudo 权限。这是我正在尝试做的一个大致示例。我正试图让它在以下操作系统上工作:centos、ubuntu、arch。

if userIsSudo; then
 chsh -s $(which zsh)
fi
Linux的

评论


答:

3赞 Raman Sailopal 11/16/2020 #1

sudo -l将显示用户可以使用权限运行的命令。如果没有可以运行的命令,将返回错误代码,因此您可以尝试:sudosudo -l

sudo -l && chsh -s $(which zsh)

评论

0赞 Andrius Solopovas 11/16/2020
就我而言,我必须这样做,所以删除任何输出,但它可以正常工作,并且不会提示输入密码。if sudo -l &> /dev/null
0赞 tink 11/18/2023
@AndriusSolopovas - 如果没有 sudo 权限的用户运行它,它会怎么做?对我来说,Ubuntu 20.04,非特权用户会收到带有 的密码提示,而不是 .对于特权用户,情况正好相反。-l-v
3赞 Cuauhtli 11/16/2020 #2

试试这个:

$ sudo -v &> /dev/null && echo "Sudoer" || echo "Not sudoer"

此外,IDK 将搜索他在组中的成员身份,即:sudo

$ groups "$(id -un)" \
    | grep -q ' sudo ' \
        && echo In sudo group \
        || echo Not in sudo group

艺术

$ getent group sudo \
    | grep -qE "(:|,)$(id -un)(,|$)" \
        && echo in sudo group \
        || echo not in sudo group

评论

0赞 Andrius Solopovas 11/16/2020
我认为第一个例子是完美的。
0赞 Andrius Solopovas 11/16/2020
sudo -v &> /dev/null 在 arch Linux 上查询执行时的密码。
0赞 Cuauhtli 11/16/2020
我不知道你在用拱门。您可以输入密码或使用其他选项。
0赞 tink 11/18/2023
它还会在 Ubuntu 上提示输入密码......
2赞 Teocci 11/25/2021 #3

通常,当你运行一个脚本时,你想知道它是否很好地结束了它,或者你得到了一个错误,或者你得到了什么样的错误,如果有的话。

这是一个更详细的片段:sudoer-script.sh

## Define error code
E_NOTROOT=87 # Non-root exit error.

## check if is sudoer
if ! $(sudo -l &> /dev/null); then
    echo 'Error: root privileges are needed to run this script'
    exit $E_NOTROOT
fi

## do something else you 

## means it was successfully executed
exit 0

现在,您可以重复使用脚本、通过管道传输脚本或与其他命令连接

sudoer-script.sh && ls

## in a script
if $(sudoer-script.sh); then
  echo 'success'
fi

## capture error
stderr=$(./sudoer-script.sh 2>&1 >/dev/null)
echo $stderr

作为功能:

is_sudoer() {
    ## Define error code
    E_NOTROOT=87 # Non-root exit error.

    ## check if is sudoer
    if ! $(sudo -l &> /dev/null); then
        echo 'Error: root privileges are needed to run this script'
        return $E_NOTROOT
    fi
    return  0
}

if is_sudoer; then
    echo "Sudoer"
else
    echo "Not sudoer"
fi
0赞 Mr. Polywhirl 11/18/2023 #4

这是 Cuauhtli 逻辑的修改示例。

我存储了一个布尔值 ( = , = ) 响应:0false1true

#!/usr/bin/env bash

IS_SUDOER=$(sudo -v &> /dev/null && echo 1 || echo 0)

if [[ "$IS_SUDOER" -eq 1 ]]; then
    sudo chown root /path/to/some/restricted/file
    sudo chmod 4755 /path/to/some/restricted/file
else
    echo "WARNING: Privileged account required to alter file permissions"
fi

这是我修改后的 Teocci 逻辑示例。

#!/usr/bin/env bash

is_sudoer() {
    ERR_NOT_ROOT=87
    if ! $(sudo -v &> /dev/null); then
        #echo "Error: Must be a privilaged user to execute"
        return $ERR_NOT_ROOT
    fi  
    return 0
}

if is_sudoer; then
    echo "Access granted!"
else
    echo "Permissioned denied!"
fi