我想检查用户是否能够使用sudo
- 但是没有需要写入密码 - 用于 bash shell 脚本目的。我做了一些研究,发现:
对于没有通过 in 进行配置的用户sudoers
- 因此无法使用sudo
- 执行sudo -n <command>
总是在终端中打印sudo: a password is required
消息。并且如果用户可以使用sudo
--sudo
是否未在会话或sudo
's中执行暂停过期——它再次打印该sudo: a password is required
消息。
此外,使用正确的解决方案(但对于其他情况)
$(sudo -n uptime 2>&1 | grep "load" | wc -l)
sudo
对于未经许可的用户总是返回 0。并且如果用户可以使用sudo
并且如果sudo
的暂停仍然有效 - 返回 1,否则返回 0
问题:所以用这种方法是不是可能真正通过命令知道用户是否可以使用sudo
- 该解决方案仅可行于知道sudo
是否暂停是否仍然有效。
到目前为止sudo -v
,解决方案几乎如下:
对于没有有关sudoers
命令返回的配置的用户
Sorry, user <username> may not run sudo on <hostname>.
如果用户可以使用,sudo
则sudo -v
要求输入密码。如果它是有效的sudo
或暂停仍然有效它返回空的。所以直到这里才有明显的区别和解决方案但因为我正在工作Bash Shell
并且我需要使用命令替换
is_user_sudo=$(sudo -v) # if is empty sudo can be used otherwise not
问题我想避免密码提示部分。这将是一个解决方案。
或者,如果存在其他参数,例如sudo -k
不要求密码(当然它会做其他事情)或其他命令来完成我的目标。
目标: 只有非根可以使用的用户sudo
可以执行一些 bash 脚本。因此,在脚本内部,我需要命令来识别该类型非根user - 因此必须通知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?
whoami
可以用其他命令替换,该命令标识WHO正在运行脚本
答案1
我承认我不太明白为什么你会想要这个以及为什么你不只是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
这里的技巧是利用尝试使用另一个程序来验证密码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.
因此,如果将 stderr 重定向到 stdout 后的响应是两行,则用户可以运行sudo
命令,如果是一行,则用户不能运行命令。
重要的:我还没有对此进行广泛的测试,我只在单个 Arch Linux 系统上尝试了如上所示的两个用户。如果上面命令的输出可以改变,如果这在其他系统上不能按预期工作,我不会感到惊讶。
sudo
对于明显的失败情况:如果用户配置为在没有密码的情况下运行命令,则这将不起作用。
答案2
我还没有找到明确的确认,但我认为按设计如果没有身份验证或权限,则无法执行此操作。
我不认为非特权用户应该能够选择任意用户和任意命令,并检查该用户是否有权使用 运行该命令sudo
。这将极大地帮助攻击者探测系统,了解哪些帐户最有价值,目前还不清楚它会带来什么好处。
值得注意的是,该/etc/sudoers
文件默认被锁定,除了 root 之外无法读取。
答案3
我想通过命令检查用户是否能够使用
sudo
- 但是没有需要写密码
groups user_name
将显示用户所属的所有组。如果用户是该sudo
组的成员,则该用户可能能够使用sudo
(正如 @terdon 指出的那样,组成员身份并不是授予使用权限的原因sudo
,但在典型情况下,用户只是简单地创建为“普通用户”或“管理员”,sudo 组成员身份与能够使用相关sudo
)。
if [ -z "$(groups user_name | grep sudo)" ]; then
echo 'user is not in sudo group'
else
echo 'user is in sudo group'
fi
当然,这不会告诉您sudoers
文件中可能存在的任何更细粒度的权限 - 您需要 root 才能读取该权限。