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

mum43rcc  于 2023-10-23  发布在  Shell
关注(0)|答案(8)|浏览(96)

我搜索了一下,在其他地方找不到这个答案。如果这是一个没有经验的人在脚本有点菜鸟问题道歉。
我试图创建一个bash脚本来设置一个服务器,其中包含应用程序所需的所有软件。简而言之,在安装docker时,我需要将当前用户添加到docker组'usermod -aG docker ',并从那里拉取一些容器。
我遇到的问题是,因为我已经将用户添加到一个组中,所以他们需要注销并再次登录,然后才能在脚本中执行任何后续操作。这当然会中断脚本并结束shell会话。有没有办法在同一个脚本中注销和重新登录,或者事情需要变得更复杂一点?
感谢任何人的帮助。希望这是一个简单的答案。

7uhlpewt

7uhlpewt1#

使用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

这个应该可以了

mrzz3bfm

mrzz3bfm2#

使用此命令:

exec su -l $USER

或:

exec sudo su -l $USER
iovurdzv

iovurdzv3#

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

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

第一行将docker二进制的组更改为docker组。第二行启用setgid标志,这意味着当您运行此二进制文件时,您的组会更改文件的组,我们刚刚将其设置为docker
这是一个安全问题,因为它使每个人都有效地在docker组中,但我在一个容器中这样做,其中唯一的用户是我想要添加到docker组的用户。所以这个解决方案只适用于特定的情况,但在这些情况下,它似乎工作得很好。

ttvkxqim

ttvkxqim4#

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

sycxhyv7

sycxhyv75#

用户需要再次登录,然后只有添加到新组的成员才有权访问文件/文件夹或运行任何命令。链接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身份验证模块来使用上述命令而无需密码。您需要在文件/etc/pam.d/su中的pam_rootok.so之后添加以下行

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

我相信这可以通过你目前的脚本只,不会有任何需要打破脚本。
(NOTE:请将上述命令中的USERNAME替换为您的实际用户名)

a0zr77ik

a0zr77ik6#

newgrp <GroupName> << END
my_command
END

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

jgzswidk

jgzswidk7#

在2023-08-12,这个问题的最高投票答案建议使用newgrp dockernewgrp docker会将该用户的 primary group 设置为指定的组(您可以通过运行groups并查看docker是返回的第一个值来验证这一点)。
但问题是寻找一种替代注销和再次登录。注销并再次登录不会修改该用户的 * 主要组 *-它将更新 * 次要组 * 列表以包括先前添加的组。(同样,您可以通过运行groups来验证这一点,并看到docker再次出现在返回的组列表中,但它不是第一个值)。因此,运行newgrp * 不会 * 具有与注销并再次登录相同的效果。运行newgrp并注销和再次登录将导致两个不同的组成员列表。
如果您想更新该用户的 * 辅助组 * 列表,以包括以前添加的组(即如果你想要一个与注销和再次登录具有相同效果的命令),请尝试:exec sg docker newgrp
HTH。
(For一个额外的点,还注意到(不像suexec sg docker newgrp工作 * 不需要 * 密码。)

ycggw6v2

ycggw6v28#

不能升级当前脚本的组。您必须重新登录。
但是,这并不意味着您必须首先退出。
您可以使用任何命令,如sudosgsu,技术上创建一个新的会话:

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

相关问题