我搜索了一下,在其他地方找不到这个答案。如果这是一个没有经验的人在脚本有点菜鸟问题道歉。
我试图创建一个bash脚本来设置一个服务器,其中包含应用程序所需的所有软件。简而言之,在安装docker时,我需要将当前用户添加到docker组'usermod -aG docker ',并从那里拉取一些容器。
我遇到的问题是,因为我已经将用户添加到一个组中,所以他们需要注销并再次登录,然后才能在脚本中执行任何后续操作。这当然会中断脚本并结束shell会话。有没有办法在同一个脚本中注销和重新登录,或者事情需要变得更复杂一点?
感谢任何人的帮助。希望这是一个简单的答案。
8条答案
按热度按时间7uhlpewt1#
使用newgrp命令登录新组。
newgrp的工作方式是更改其调用者的组标识,类似于登录。同一个人保持登录状态,当前目录不变,但对文件的访问权限的计算是根据新的组ID执行的。
因此,对于您的情况,您将使用:用途:
检查你的新主组,它应该是docker:
从/etc/group确认
这个应该可以了
mrzz3bfm2#
使用此命令:
或:
iovurdzv3#
我通过在
docker
二进制文件上设置setgid标志来解决这个问题:第一行将
docker
二进制的组更改为docker
组。第二行启用setgid标志,这意味着当您运行此二进制文件时,您的组会更改文件的组,我们刚刚将其设置为docker
。这是一个安全问题,因为它使每个人都有效地在
docker
组中,但我在一个容器中这样做,其中唯一的用户是我想要添加到docker
组的用户。所以这个解决方案只适用于特定的情况,但在这些情况下,它似乎工作得很好。ttvkxqim4#
据我所知-不。为了避免这个问题,我个人使用ansible(ansible使用SSH)。我在将用户添加到组后断开连接,重新连接,然后继续脚本。
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给出了为什么需要这样做的详细解释。
您需要使用任何方式再次登录,然后只有您可以继续您的脚本。
如果您只需要使用一个用户,那么您可以使用下面的命令再次登录:
这将要求密码在这里。为此,您可以使用
pam
身份验证模块来使用上述命令而无需密码。您需要在文件/etc/pam.d/su
中的pam_rootok.so
之后添加以下行我相信这可以通过你目前的脚本只,不会有任何需要打破脚本。
(NOTE:请将上述命令中的
USERNAME
替换为您的实际用户名)a0zr77ik6#
在这里看到我的答案:https://superuser.com/questions/272061/reload-a-linux-users-group-assignments-without-logging-out#
jgzswidk7#
在2023-08-12,这个问题的最高投票答案建议使用
newgrp docker
。newgrp docker
会将该用户的 primary group 设置为指定的组(您可以通过运行groups
并查看docker
是返回的第一个值来验证这一点)。但问题是寻找一种替代注销和再次登录。注销并再次登录不会修改该用户的 * 主要组 *-它将更新 * 次要组 * 列表以包括先前添加的组。(同样,您可以通过运行
groups
来验证这一点,并看到docker
再次出现在返回的组列表中,但它不是第一个值)。因此,运行newgrp
* 不会 * 具有与注销并再次登录相同的效果。运行newgrp
并注销和再次登录将导致两个不同的组成员列表。如果您想更新该用户的 * 辅助组 * 列表,以包括以前添加的组(即如果你想要一个与注销和再次登录具有相同效果的命令),请尝试:
exec sg docker newgrp
HTH。
(For一个额外的点,还注意到(不像
su
)exec sg docker newgrp
工作 * 不需要 * 密码。)ycggw6v28#
不能升级当前脚本的组。您必须重新登录。
但是,这并不意味着您必须首先退出。
您可以使用任何命令,如
sudo
,sg
或su
,技术上创建一个新的会话: