如何检查我是否有sudo访问权限
我最近因为这个问题遇到了麻烦
$sudo vim /etc/motd
[sudo] password for bruce:
bruce is not in the sudoers file. This incident will be reported.
有什么方法可以检查我是否有sudo访问权限吗?
运行sudo -v
。它通常用来延长sudo密码超时时间,但也可以用来确定你是否有任何sudo
权限。
$ sudo -v
Sorry, user [username] may not run sudo on [hostname].
$ sudo ls
[sudo] password for [username]:
Sorry, user [username] is not allowed to execute '/bin/ls' as root on [hostname].
人页摘录:
如果给定了-v(validate)选项,sudo会更新用户的时间戳,必要时提示用户的密码。这将延长 sudo 超时 5 分钟(或在 sudoers 中设置的超时时间),但不会运行命令。虽然在这种情况下,当你试图执行一个你不被允许执行的命令时,消息看起来是不一样的(而且不会向root用户发送邮件),但如果管理员阅读了
/var/log/secure
,你仍然有可能会遇到麻烦。注意,这个命令需要你输入密码。
这是非常简单的。运行sudo -l
。这将列出你所拥有的任何sudo权限。
Gerald Schade的回答 这里,还是可以改进的!
使用
prompt=$(sudo -nv 2>&1)
if [$? -eq 0]; then
# exit code of sudo-command is 0
echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
echo "has_sudo__needs_pass"
else
echo "no_sudo"
fi
这里有一个完整的脚本使用实例:
#!/usr/bin/env bash
is_root () {
return $(id -u)
}
has_sudo() {
local prompt
prompt=$(sudo -nv 2>&1)
if [$? -eq 0]; then
echo "has_sudo__pass_set"
elif echo $prompt | grep -q '^sudo:'; then
echo "has_sudo__needs_pass"
else
echo "no_sudo"
fi
}
elevate_cmd () {
local cmd=$@
HAS_SUDO=$(has_sudo)
case "$HAS_SUDO" in
has_sudo__pass_set)
sudo $cmd
;;
has_sudo__needs_pass)
echo "Please supply sudo password for the following command: sudo $cmd"
sudo $cmd
;;
*)
echo "Please supply root password for the following command: su -c \"$cmd\""
su -c "$cmd"
;;
esac
}
if is_root; then
echo "Error: need to call this script as a normal user, not as root!"
exit 1
fi
elevate_cmd which adduser
对我来说,’sudo -v
‘和’sudo -l
‘在脚本中没有工作,因为有时是交互式的(问我密码,就像上面提到的那样)。’sudo -n -l
‘也不能工作,虽然我有sudo权限,但它给出的退出代码是'1',因为缺少密码。但将命令扩展为:
A=$(sudo -n -v 2>&1);test -z "$A" || echo $A|grep -q asswor
对我来说是成功的。这个表达式给出了0
,如果当前用户可以调用'sudo',如果不能,则给出了1
。
解释:
的附加参数-n
可以防止交互。
命令’sudo
‘的输出$A
可能是:
–空(在这种情况下,当前用户可以调用sudo),或者:
–说明当前用户未被授权调用sudo,或者:
–密码的问题文本(在这种情况下,用户被授权)。
I’ve got low rank to vote and comment, but I wanted to upvote Gerald Schade’s answer, as I’ve found that the only way previously, and thought that no1 else knows it - till now :D
btw my solution:
[["$(whereis sudo)" == *'/'* && "$(sudo -nv 2>&1)" != 'Sorry, user'*]]
(from the end of 2015 mwhahaaa)
“须弥座通道 "有多种口味。有两种主要的方式,首先你需要在/etc/sudoers文件中设置sudo访问。首先,你或你的组成员需要在/etc/sudoers文件中设置了sudo访问权限。最近足够的时间,即超时未过。(有趣的是:你可以在你的sudoer文件中把超时时间设置得很长。)
我经常想在一个需要sudo一些步骤的脚本的prolog中测试第二种访问方式。
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is enabled.
bash-3.2$ sudo -K
bash-3.2$ if sudo -S -p '' echo -n < /dev/null 2> /dev/null ; then echo 'Sudo is enabled.' ; else echo 'Sudo is not enabled' ; fi
Sudo is not enabled
&001
-S告诉sudo从stdin中读取密码。-p设置一个空提示符。
因为它把 stderr 发送到 /dev/null,所以它也会检查用户是否有第一种类型的 sudo 访问。