与额外的补充组一起运行程序

与额外的补充组一起运行程序

我正在寻找类似 sudo 的东西(或可以从 sudo 运行的东西),它允许我使用我的 uid 和主要 gid 运行程序,但有一个额外的补充组。

答案1

警告#1:这是另一种“hacky”方法。

警告#2:并非所有应用程序/脚本都能够处理这个不明确的 uid/gid。

创建一个具有相同 uid 和 gid 的新用户,方法是使用useradd--non-unique允许存在多个具有相同 uid/gid 的用户的选项以及--groups指定其他组的选项。例如:

useradd --uid 1001 --gid 1001 --groups 1002,1003 --shell /bin/bash \
        --home /home/cloneduser cloneduser

然后您应该以新用户身份运行该程序。我建议使用 来调试它id

答案2

perl例如,您可以从特权进程中使用以下命令设置有效且真实的 uid/gid 以及补充 id 列表:

$ sudo perl -e '$( = $) = "1 2 3"; $> = $< = 4; exec @ARGV' id
uid=4(sync) gid=1(daemon) groups=1(daemon),2(bin),3(sys)

详情请参阅perldoc -v '$)'...。

答案3

目前尚不清楚您是否希望附加组成为主组,即所有创建的新文件的组;或者如果该组甚至不是该用户的辅助组。

在第一种情况下,如果您已经是该组的成员,则可以使用两个不同的命令“newgrp”和“sg”。两者都实现相同的结果,但一个使用新的 gid 执行交互式 shell,而第二个仅执行命令。

在第二种情况下,您应该使用命令 groupadd 或 groupmod 为组设置密码,然后,当使用“newgrp”或“sg”时,系统将在执行命令之前提示您输入该密码。

另一种不同且更简单的方法是更改​​可执行文件的组所有者,并设置其 setgid 位。有关此位的更多信息位于 chmod 的手册页上。

答案4

no_new_privs可以使用以下命令设置任意进程权限设置(UID、GID 补充组、功能、位、securebits、SELinux 标签、AppArmor 配置文件)setpriv实用程序命令来自util-linux收藏

要将命名组临时添加到新进程的补充组中,setpriv可以与以下命令结合使用sudo

function with_group() {
    local -r target="$1"
    shift
    sudo --preserve-env setpriv --reuid "$(id -u)" --regid "$(id -g)" --groups "$(id -G | tr ' ' ','),$(getent group "$target" | cut -d: -f3)" "$@"
}

这可以用于临时添加docker组作为补充组,以 root 身份运行命令:

with_group docker docker-compose ps

相关内容