无密码检查用户是否可以使用“sudo”

Man*_*dan 5 command-line bash sudo shell-script command-substitution

我想检查用户是否能够使用sudo(但无需编写密码)用于 bash shell 脚本。我做了一些研究,发现:

对于没有通过 in 进行配置的用户sudoers- 因此无法使用sudo- 执行sudo -n <command> 始终在终端中打印sudo: a password is required消息。如果用户可以使用sudo--是否sudo未在会话中执行或sudo超时过期--它会再次打印该sudo: a password is required消息。

此外,使用正确的解决方案(但对于其他情况)

$(sudo -n uptime 2>&1 | grep "load" | wc -l)
Run Code Online (Sandbox Code Playgroud)

sudo对于未经许可的用户始终返回 0。如果用户可以使用并且超时sudo仍然sudo有效- 则返回 1,否则返回 0

问题:因此,使用这种方法不可能真正通过命令知道用户是否可以使用- 该解决sudo方案只能知道sudo超时是否仍然有效。

到目前为止sudo -v,解决方案几乎如下:

对于没有有关sudoers命令返回的配置的用户

Sorry, user <username> may not run sudo on <hostname>.
Run Code Online (Sandbox Code Playgroud)

如果用户可以使用sudo,则sudo -v要求输入密码。如果它有效或sudo超时仍然有效,则返回。因此,直到这里为止,存在明显的差异和解决方案,但因为我正在使用Bash Shell并且我需要使用命令替换

is_user_sudo=$(sudo -v) # if is empty sudo can be used otherwise not
Run Code Online (Sandbox Code Playgroud)

问题我想避免密码提示部分。这将是一个解决方案。

或者,如果存在其他参数,例如sudo -k不要求密码(当然它会做其他事情)或其他命令来完成我的目标。

目标:只有非 root用户(可以使用sudo)才能执行一些 bash 脚本。因此,在脚本内部,我需要命令来识别该类型的非 root用户 - 因此必须通知non-root不能使用的用户sudo并停止脚本执行。

例如:

# an if statement about 'id -u' not equals a 0
can_use_sudo=$(<command> whoami) # so the non-root user 
                                 # is able to use sudo or not?
Run Code Online (Sandbox Code Playgroud)

whoami可以用其他命令替换,该命令标识正在运行脚本

ter*_*don 11

我承认我不太明白为什么你会想要这个以及为什么你不只是sudo whoami在脚本开头运行或执行某些操作来立即要求用户输入密码并在用户无法继续时退出,但没关系。这应该有效,至少在 Linux 系统上(尚未检查其他sudo实现):

sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 | wc -l)
if [ $sudo_response = 2 ]; then
    can_sudo=1
elif [ $sudo_response = 1 ]; then
    can_sudo=0
else
    echo "Unexpected sudo response: $sudo_response" >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

这里的技巧是利用尝试使用另一个程序来验证密码的askpass选项。sudo通过将其设置为/bin/false,我们可以根据用户是否可以sudo以 root 身份运行命令来获得两个标准响应:

## A user with sudo rights
terdon@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami 2>&1 
sudo: no password was provided
sudo: a password is required

## A user without sudo rights
bib@tpad $ SUDO_ASKPASS=/bin/false sudo -A whoami
bib is not in the sudoers file.  This incident will be reported.
Run Code Online (Sandbox Code Playgroud)

因此,如果将 stderr 重定向到 stdout 后的响应是两行,则用户可以运行sudo命令,如果是一行,则用户不能运行命令。

重要提示:我还没有对此进行广泛的测试,我只在单个 Arch Linux 系统上尝试了如上所示的两个用户。如果上面命令的输出可以改变,如果这在其他系统上不能按预期工作,我不会感到惊讶。

sudo对于明显的失败情况:如果用户配置为在没有密码的情况下运行命令,则这将不起作用。


Wil*_*ard 8

我还没有找到明确的确认,但我认为按照设计,没有身份验证或权限就无法做到这一点。

我认为非特权用户不应该能够选择任意用户和任意命令,并检查该用户是否有权使用sudo. 这将极大地帮助任何攻击者探测系统,以了解哪些帐户最容易受到攻击,但目前尚不清楚它会带来什么好处。

值得注意的是,该/etc/sudoers文件默认被锁定,除了 root 之外无法读取。