Bash/xargs:如何批量分配用户权限



我创建了一个新用户。我的当前用户显然拥有以下权限:

$ groups
max adm cdrom sudo dip plugdev lpadmin lxd sambashare

其中,max是当前用户帐户的名称。

我尝试了参数扩展,但${groups}的输出为空,所以我只是将组管道传输到xargs

$ groups | xargs -I _ sudo usermod -aG _ new_user_name

我得到的错误消息是没有文件夹max adm cdrom sudo dip plugdev lpadmin lxd sambashare,因为显然groups的输出没有被空白分割。

但正如我所说,${groups}是空的,所以我无法通过管道连接到xargs。

第二次尝试:

my_arr=(adm cdrom sudo dip plugdev lpadmin lxd sambashare)
$ echo ${my_arr[@]} | xargs -I _ usermod -aG _ new_user_name

即使我没有将参数展开放在双引号中,数组的参数也不会被拆分。

xargs仍然将管道参数视为一个大字符串adm cdrom sudo dip plugdev lpadmin lxd sambashare

什么是正确的解决方案?

usermod一次向一个组添加一个或多个用户,因此您必须使用一个循环:

for g in "${my_arr[@]}"; do
usermod -aG "$g" new_user_name
done

请注意,默认情况下,xargs在一次调用所提供的命令时使用尽可能多的参数,因此,如果使用xargs,请将每次使用的参数数量限制为一个(-n 1(:

echo "${my_arr[@]}" | xargs -n 1 -I _ usermod -aG _ new_user_name

关键问题是需要告诉xargs一次读取一个参数。

不太重要的是,您可能不希望在usermod的输入中包含max

groups |
# Trim away first token (max)
sed 's/^[^ ]* //' |
# Pass to xargs with -n 1
xargs -n 1 -I _ sudo usermod -aG _ new_user_name

在Linux上,您可能需要将--delimiter ' '添加到xargs命令行中。

您可以使用xargs-i标志。这将拆分字符串,在下一个语句中,您可以使用{}访问每个令牌。这将为每个组运行sudo命令。

所以试试

groups | xargs -i sudo usermod -aG {} new_user_name

相关内容

  • 没有找到相关文章

最新更新