我需要为用户授予 sudo 权限以获得关机权限。但用户只能发出时间大于 3 小时的关机请求。我一直在尝试通过实现通配符。
例如 :
username ALL=/usr/sbin/shutdown +[[:digit:]] -> Trial for any number
username ALL=/usr/sbin/shutdown +[180-*] -> Trial for 180 minutes and beyond
还有许多其他情况,但没有任何效果。
答案1
我的第一个想法是一个包装脚本,您可以在其中授予对该脚本的 sudo 访问权限,然后在该脚本中进行参数检查。
username ALL=/usr/local/sbin/shutdown-wrapper
然后对于关闭包装器来说是这样的:
#!/bin/sh
case $1 in
*[!0-9]*) echo Invalid; exit 2;;
esac
if [ "$1" -ge 180 ]
then
/usr/sbin/shutdown +"$1"
else
echo Invalid
exit 2
fi
...并指示用户拨打,sudo /usr/local/sbin/shutdown-wrapper N
其中 N 是分钟数。
另一种选择是使用从sudoers 手册页的通配符部分:
username ALL=(ALL:ALL) /usr/sbin/shutdown +18[0-9], \
/usr/sbin/shutdown +19[0-9], \
/usr/sbin/shutdown +[2-9][0-9][0-9], \
/usr/sbin/shutdown +[1-9][0-9][0-9][0-9]*
这表示分钟 180 到 189、190 到 199、200 到 999,然后是至少以 4 位数字开头的任何内容(数字或其他!),其中第一个数字不能为零。这将允许无效的时间范围,例如/usr/sbin/shutdown +9999jeff
,这只会导致 的解析错误shutdown
:
无法解析时间规范:+9999jeff