有些命令需要用户在一个组中才能执行。我正在运行一个非交互式bash脚本script.sh
,如下所示
#!/bin/bash
sudo usermod -aG $USER docker
# this line requires user logging to succeed
docker ps
当第一次调用脚本bash script.sh
时,docker ps
行会抱怨权限不足,因为sudo usermod -aG $USER docker
行修改的新的组成员关系需要用户重新登录shell才能生效。
我的问题:是否有一种方法可以触发重新登录在一个非互动的方式?
当您对用户进行更改时,如添加,删除组,您将不得不从当前会话注销,然后,您将能够使用docker命令没有任何问题。如果您使用的是终端,另一个解决方案是使用su
命令。例如,您的脚本可以像这样:
#!/bin/bash
sudo usermod -aG $USER docker
su - $USER #this line is used to login with the $USER as a login shell
docker ps
命令在这个脚本中不起作用,我忘了提到,当您运行su - $USER
时,您必须在登录shell中键入该命令。但是,还有另一种解决方案,您可以为su
命令使用-c
选项。例如:
su - $USER -c "docker ps"
或者,如果您想使用多个命令,您可以尝试在每个脚本的末尾使用分号:
su - $USER -c "docker ps;docker images;..."
或者,如果您有几个命令,您可以将它们保存在一个文件中,并将文本作为-c
选项的参数发送:
在你的文本文件中可能是(dockerscripts.txt):
docker ps
docker images
docker info
su
命令可能是:
su - $USER -c "$(cat dockerscripts.txt)"
检查登录用户的当前组的提示是使用命令groups
所以,如果你试着这样做:
sudo usermod -aG $USER docker
groups # this will display the current groups of $USER but the `docker` group will not be there yet
su - $USER
在该命令之后,您将进入登录shell,因此您必须键入命令groups
,当您运行它时,这将显示$USER的当前组,包括docker
组。
注意:当您从登录shellsu - $USER
注销时,组将不再存在,所以如果您想使用docker命令,您将不得不再次使用su - $USER
。使用新组的有效方法是从会话注销(如果您使用的是桌面环境)。
您可以查看此链接以获取更多有用信息: