我搜索过,但在其他地方找不到这个答案。如果对于没有脚本编写经验的人来说这有点菜鸟问题,我深表歉意。
我正在尝试创建一个 bash 脚本来设置一个服务器,其中包含应用程序所需的所有软件。简而言之,在安装 docker 时,我需要将当前用户添加到 docker 组“usermod -aG docker ”,然后从那里拉取一些容器。
我遇到的问题是,因为我已将用户添加到组中,所以他们需要先注销并重新登录,然后才能获得在脚本中执行任何操作的权限。这当然会破坏脚本并结束 shell 会话。 有没有办法在同一个脚本中注销并重新登录,或者事情需要变得更复杂一点吗?
感谢任何人对此的帮助。希望这对某人来说是一个简单的答案。
使用 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
这应该可以解决问题。
使用此命令:
exec su -l $USER
或:
exec sudo su -l $USER
我通过在
docker
二进制文件上设置 setgid 标志来解决这个问题:
sudo chgrp docker $(which docker)
sudo chmod g+s $(which docker)
第一行将
docker
二进制组更改为 docker
组。第二行启用 setgid 标志,这意味着当您运行此二进制文件时,您的组会更改文件的组,我们刚刚将其设置为 docker
。
这是一个安全问题,因为它使得实际上每个人都在
docker
组中,但我是在容器内执行此操作的,其中唯一的用户是我无论如何都想添加到 docker
组中的用户。所以这个解决方案只适用于特定情况,但在这些情况下它似乎工作得很好。
据我所知 - 没有。 为了避免这个问题,我个人使用ansible(ansible使用SSH)。将用户添加到组后断开连接,重新连接并继续脚本。
用户需要重新登录,然后只有添加到新组的成员才有权限访问文件/文件夹或运行任何命令。 链接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
替换为您的实际用户名)
newgrp <GroupName> << END
my_command
END
在这里查看我的回答: https://superuser.com/questions/272061/reload-a-linux-users-group-assignments-without-logging-out#
在 2023 年 8 月 12 日,此问题得票最高的答案建议使用
newgrp docker
。 newgrp docker
会将该用户的 主要组 设置为指定的组(您可以通过运行 groups
并查看 docker
是返回的第一个值来验证这一点)。
但问题是寻找注销并重新登录的替代方法。注销并再次登录不会修改该用户的主要组 - 它将具有更新次要组列表以包含之前添加的组的效果。 (同样,您可以通过运行
groups
并查看 docker
再次出现在返回的组列表中来验证这一点,但它不是 不是第一个值)。因此,运行 newgrp
不会 与注销并重新登录具有相同的效果。运行 newgrp
并注销并再次登录将产生 2 个不同的组成员列表。
如果您想更新该用户的辅助组列表以包含之前添加的组(即,如果您想要一个与注销并再次登录具有相同效果的命令),请尝试:
exec sg docker newgrp
HTH.
(作为奖励积分,另请注意(与
su
不同)exec sg docker newgrp
无需密码即可工作。)
但是,这并不意味着您必须先注销。
您可以使用任何命令,如
sudo
、
sg
或 su
,从技术上讲可以创建新会话:usermod -aG docker "$USER" # Add to group
sg "$(id -gn)" -c "groups" # Create new session and show groups including that one