如何在不注销/登录的情况下将用户添加到组 - Bash 脚本

问题描述 投票:0回答:8

我搜索过,但在其他地方找不到这个答案。如果对于没有脚本编写经验的人来说这有点菜鸟问题,我深表歉意。

我正在尝试创建一个 bash 脚本来设置一个服务器,其中包含应用程序所需的所有软件。简而言之,在安装 docker 时,我需要将当前用户添加到 docker 组“usermod -aG docker ”,然后从那里拉取一些容器。

我遇到的问题是,因为我已将用户添加到组中,所以他们需要先注销并重新登录,然后才能获得在脚本中执行任何操作的权限。这当然会破坏脚本并结束 shell 会话。 有没有办法在同一个脚本中注销并重新登录,或者事情需要变得更复杂一点吗?

感谢任何人对此的帮助。希望这对某人来说是一个简单的答案。

bash shell docker logout usergroups
8个回答
17
投票

使用 newgrp 命令登录到新组。

newgrp 的工作方式是更改调用者的组标识,类似于登录。同一个人保持登录状态,当前目录不变,但文件访问权限的计算是根据新的组 ID 进行的。

因此,对于您的情况,您将使用:

# usermod -aG docker user
# newgrp docker

检查你的新主要组,它应该是 docker:

$ id -g
989

从/etc/group确认

$ cat /etc/group | grep `id -g`
docker:x:989:jmutai

这应该可以解决问题。


4
投票

使用此命令:

exec su -l $USER

或:

exec sudo su -l $USER

3
投票

我通过在

docker
二进制文件上设置 setgid 标志来解决这个问题:

sudo chgrp docker $(which docker)
sudo chmod g+s $(which docker)

第一行将

docker
二进制组更改为
docker
组。第二行启用 setgid 标志,这意味着当您运行此二进制文件时,您的组会更改文件的组,我们刚刚将其设置为
docker

这是一个安全问题,因为它使得实际上每个人都在

docker
组中,但我是在容器内执行此操作的,其中唯一的用户是我无论如何都想添加到
docker
组中的用户。所以这个解决方案只适用于特定情况,但在这些情况下它似乎工作得很好。


0
投票

据我所知 - 没有。 为了避免这个问题,我个人使用ansible(ansible使用SSH)。将用户添加到组后断开连接,重新连接并继续脚本。


0
投票

用户需要重新登录,然后只有添加到新组的成员才有权限访问文件/文件夹或运行任何命令。 链接https://unix.stackexchange.com/questions/6387/i-added-a-user-to-a-group-but-group-permissions-on-files-still-have-no-effect/11573 #11573 详细解释了为什么需要这样做。

您需要使用任何一种方式重新登录,然后只有您可以继续您的脚本。

如果您只需要使用单个用户,那么您可以使用以下命令再次登录:

su -l USERNAME

这里会询问密码。为此,您可以使用

pam
身份验证模块来使用上述命令而无需密码。您需要在文件中的
pam_rootok.so
之后添加以下行
/etc/pam.d/su

auth       [success=ignore default=1] pam_succeed_if.so user = USERNAME
auth       sufficient   pam_succeed_if.so use_uid user = USERNAME

我相信这可以仅通过您当前的脚本来完成,并且不需要破坏脚本。

(注意:请将上述命令中的

USERNAME
替换为您的实际用户名)


0
投票
newgrp <GroupName> << END
my_command
END

在这里查看我的回答: https://superuser.com/questions/272061/reload-a-linux-users-group-assignments-without-logging-out#


0
投票

在 2023 年 8 月 12 日,此问题得票最高的答案建议使用

newgrp docker
newgrp docker
会将该用户的 主要组 设置为指定的组(您可以通过运行
groups
并查看
docker
是返回的第一个值来验证这一点)。

但问题是寻找注销并重新登录的替代方法。注销并再次登录不会修改该用户的主要组 - 它将具有更新次要组列表以包含之前添加的组的效果。 (同样,您可以通过运行

groups
并查看
docker
再次出现在返回的组列表中来验证这一点,但它不是 不是第一个值)。因此,运行
newgrp
不会 与注销并重新登录具有相同的效果。运行
newgrp
并注销并再次登录将产生 2 个不同的组成员列表。

如果您想更新该用户的辅助组列表以包含之前添加的组(即,如果您想要一个与注销并再次登录具有相同效果的命令),请尝试:

exec sg docker newgrp

HTH.

(作为奖励积分,另请注意(与

su
不同)
exec sg docker newgrp
无需密码即可工作。)


-1
投票

但是,这并不意味着您必须先注销。

您可以使用任何命令,如

sudo

sg
su
,从技术上讲可以创建新会话:

usermod -aG docker "$USER" # Add to group sg "$(id -gn)" -c "groups" # Create new session and show groups including that one

© www.soinside.com 2019 - 2024. All rights reserved.