我正在寻找类似 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