我们有一个 git 提交后脚本,需要与 Git 和 Trac 一起运行,当有人提交某些内容时,将调用一个钩子来运行以下命令:
trac-admin /path/to/trac changeset added "reponame" $REV
其中 $REV 是动态的,取决于推送的修订。问题是,此命令要求提交用户对 trac 数据库具有写权限。
我们有许多用户提交,他们都在一个名为“git”的 Linux 组中,我可以将 trac DB 文件 (SQLite) 的 rw 权限授予该组,这样就可以正常工作,但是“git”组中的任何人都可以删除该数据库。它目前归 www-data、www-data 所有。
我添加了这样的 sudo 配置行:
%git ALL=(www-data) NOPASSWD: /usr/local/bin/trac-admin
这是可行的,它允许脚本工作,但是现在他们拥有 trac-admin 附带的所有选项,我想限制此命令的访问权限以包含 /path/to/trac 的参数和添加的更改集。
我尝试使用 /usr/local/bin/trac-admin /path/to/trac 变更集添加“reponame”来添加 Cmnd Alias,但是它不起作用,因为添加的 $REV 破坏了它,并且无法动态添加到 /etc/sudoers 中。
有没有办法在 Cmnd Alias 中包含通配符以使其在 sudoers 中工作?
答案1
放入 /usr/local/bin/whatever
#!/bin/bash --
reponame="$( printf '%q' "$1" )"
rev="$( printf '%q' "$2" )"
/usr/local/bin/trac-admin /path/to/trac changeset added "$reponame" "$rev"
然后在 sudoers 中使用 /usr/local/bin/whatever。让用户执行这些指令:
sudo whatever repo rev
答案2
创建一个只执行您想要授予访问权限的操作的脚本,然后授予该脚本的 sudo 访问权限,而不是授予 trac-admin 的 sudo 访问权限