-n, --non-interactive
Avoid prompting the user for input of any kind. If a
password is required for the command to run, sudo will
display an error message and exit.
if sudo -n true 2>/dev/null; then
echo "user can run passwordless sudo"
else
echo "user cannot run passwordless sudo"
fi
甚至
sudo -n true 2>/dev/null &&
echo "user can run passwordless sudo" ||
echo "user cannot run passwordless sudo"
或者,在脚本中,如果您只是想退出:
sudo -n true 2>/dev/null || exit 1
当然,这仅检查用户当前是否可以运行sudo无密码命令。它不区分已经通过身份验证且在超时内的用户(sudo因此不会提示输入密码)和通常被授予无需密码即可运行所有命令权限的用户。我认为这是所需的行为,因为问题中没有提到相反的内容,并且 OP 自己的答案以相同的方式工作。如果您只想检查完全无密码sudo,您可以预先运行sudo -k以清除当前凭据:
$ sudo -k; sudo -n true 2>/dev/null &&
echo "user can run passwordless sudo" ||
echo "user cannot run passwordless sudo"
我已经在一些主要的 Linux 发行版(如 Debian、Redhat 和 Oracle Enterprise Linux 7)的 BASH 中测试了这一点。此技术在 FreeBSD 或任何 BSD(包括 macOS)下不起作用。
if SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; then
echo 'Current user has access to passwordless sudo'
else
echo 'Current user DOES NOT have access to passwordless sudo'
fi
如果您只想检查用户是否有权无密码
sudo
访问,那么您只需运行即可sudo -n
。来自man sudo
:这意味着
sudo -n
除非用户可以不输入密码运行,否则只会返回错误sudo
。更复杂的例子是SUDO_ASKPASS
确定用户是否有权限运行sudo
,检查是否无密码sudo
更简单。您可以执行以下操作:甚至
或者,在脚本中,如果您只是想退出:
当然,这仅检查用户当前是否可以运行
sudo
无密码命令。它不区分已经通过身份验证且在超时内的用户(sudo
因此不会提示输入密码)和通常被授予无需密码即可运行所有命令权限的用户。我认为这是所需的行为,因为问题中没有提到相反的内容,并且 OP 自己的答案以相同的方式工作。如果您只想检查完全无密码sudo
,您可以预先运行sudo -k
以清除当前凭据:现在,正如@Kamil Maciorowski在评论中提到的那样,如果用户可能被授予无密码
sudo
访问/usr/bin/true
权限,则此操作将失败。为了防止这种情况,您可以改为执行以下操作:/tmp/true
在这里,通过创建指向的符号链接/usr/bin/true
,即使/usr/bin/true
设置为使用无密码运行,这也将起作用sudo
。现在,如果我们有点偏执,理论上可能有人也设置/tmp/true
为使用无密码运行sudo
。为了防范这种不太可能发生的情况,您可以执行以下操作:在这里,我们将
/usr/bin/true
(在我的系统上这是一个很小的 27K 文件) 复制到/tmp
具有随机名称 (保证不存在) 的目录中,然后使用该名称进行检查。虽然理论上仍有可能有人随机将该特定字符串添加到sudoers
,但这种可能性非常小,我认为可以安全地忽略它们。我已经在一些主要的 Linux 发行版(如 Debian、Redhat 和 Oracle Enterprise Linux 7)的 BASH 中测试了这一点。此技术在 FreeBSD 或任何 BSD(包括 macOS)下不起作用。
这利用了尝试使用另一个程序来验证密码
askpass
的选项。通过将其设置为,将根据用户是否可以运行无密码命令返回两个标准响应之一。sudo
/bin/false
sudo
测试用例
测试用例矩阵如下:
案例 1. 具有无密码 sudo 权限的用户
案例 2. 用户具有 sudo 权限但需要密码
案例 3. 没有任何 sudo 权限的用户
如果返回代码为 0,则用户可以运行无密码
sudo
命令;如果返回代码非零(例如 1),则表示用户无权访问。ps 感谢 terdon 为这个答案提供了起点:https://unix.stackexchange.com/a/692109/22709