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

时间:2018-03-22 17:14:07

标签: bash shell docker logout usergroups

我搜索过,在其他地方找不到这个答案。如果对于没有经历过脚本编写经验的人来说,这是一个noob问题,请道歉。

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

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

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

7 个答案:

答案 0 :(得分:2)

使用 newgrp 命令登录新组。

newgrp的工作方式是它更改其调用者的组标识,类似于登录。同一个人仍然登录,并且当前目录未更改,但是对新文件组ID执行文件访问权限的计算。

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

# usermod -aG docker user
# newgrp docker

检查您的新主要群组,它应该是泊坞广告:

$ id -g
989

从/ etc / group确认

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

这应该可以解决问题。

答案 1 :(得分:0)

newgrp <GroupName> << END
my_command
END

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

答案 2 :(得分:0)

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

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

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

这是一个安全问题,因为这样做可以使每个人都有效地属于docker组,但是我是在一个容器内完成此操作的,唯一的用户就是我要添加到{{ 1}}分组。因此,此解决方案仅适用于特定情况,但在这些情况下,似乎很好用。

答案 3 :(得分:0)

使用这个命令:

exec su -l $USER

或:

exec sudo su -l $USER

答案 4 :(得分:-1)

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

答案 5 :(得分:-1)

您无法升级当前脚本的组。你必须再次登录。

但是,这并不意味着您必须先退出。

您可以使用技术上创建新会话的sudosgsu等任何命令:

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

答案 6 :(得分:-1)

用户需要再次登录,然后只有添加到新组的成员才有权访问文件/文件夹或运行任何命令。 链接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