我搜索过,在其他地方找不到这个答案。如果对于没有经历过脚本编写经验的人来说,这是一个noob问题,请道歉。
我尝试创建一个bash脚本来设置一个服务器,其中包含应用程序所需的所有软件。简而言之,在安装docker时,我需要将当前用户添加到docker group' usermod -aG docker',并从那里拉出一些容器。
我遇到的问题是,因为我已将用户添加到群组中,所以他们需要先注销并重新登录,然后才能在脚本中执行任何操作。这当然会破坏脚本并结束shell会话。 有没有办法在同一个脚本中再次注销并重新登录,或者是否需要更复杂的事情?
感谢任何人对此的帮助。希望它对某人来说是一个简单的答案。
答案 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)
您无法升级当前脚本的组。你必须再次登录。
但是,这并不意味着您必须先退出。
您可以使用技术上创建新会话的sudo
,sg
或su
等任何命令:
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
)