sudoers 行是
%game_servers ALL= NOPASSWD:/usr/bin/renice
它允许组成员renice
在没有密码的情况下由任何用户运行任何进程,但我想renice
只允许组成员自己的进程,为负值。
我无法从man sudoers
我想到改变的地方找到ALL=(root:root)
答案ALL=
,事实证明这是个坏主意
ALL=()
是语法错误。
答案1
您希望组成员只能执行renice
自己的进程。这是没有条目的默认行为sudoers
。默认情况下,他们可以renice
在范围内为自己的进程设置好值0 - 19
。
有权sudo
访问renice
允许他们扩大范围-20 to 19
以及renice
不属于他们的进程。
运行时man renice
,我没有看到任何选项可以让您做您想做的事情。如果用户有权sudo
访问该renice
命令,那么他们可以向其中添加允许他们执行renice
任何进程的选项。
我认为您的解决方案是删除文件renice
中的条目sudoers
。那么你的用户只能使用renice
他们自己的进程。他们将失去将其好值设置为 之间的值的能力-20 and -1
,但这就是这里所需的权衡。
答案2
使用包装器renice
,例如:
#!/bin/sh
priority="$1"
pid="$2"
owner=`ps -h -o uid $pid`
if [ $owner != ${SUDO_UID} ]; then
echo "Only your own processes can be reniced" >&2
exit 1
fi
renice $priority $pid
请注意,该示例很脆弱,并且由于所有权检查和优先级更改之间的延迟而容易出现竞争条件。