【问题标题】:Bash/xargs: How to mass assign user privileges?Bash/xargs:如何批量分配用户权限?
【发布时间】:2021-08-07 14:25:57
【问题描述】:

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

$ 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

什么是正确的解决方案?

【问题讨论】:

  • 你在使用/bin/sh???数组是 Bash 功能,而不是 POSIX sh
  • 要稍微扩展前面的评论,您需要使用#!/bin/bash 而不是#!/bin/sh(或者不使用数组,并找出不同的方法)。另见Difference between sh and bash
  • 我回滚了您的最新编辑,因为它分散了主要问题的注意力,并且包含在常见的常见问题解答中。
  • 好吧,我的错。我对我的错误感到非常抱歉。 iBug 的脚本使用#!/bin/bash。感谢您的努力。我只是一个使用 shell 的初学者。感谢您指点我"Difference between sh and bash" 我会阅读和学习。

标签: linux bash ubuntu rights


【解决方案1】:

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

【讨论】:

  • 所以我必须在每个数组字符串的末尾添加\n 或其他内容?顺便说一句:为什么不产生 ${groups} 任何输出?谢谢
  • @vonspotz 不,您不会手动添加换行符。使用循环几乎可以做到。顺便说一句:使用$(groups) 捕获命令的输出,而不是扩展变量。
  • 我已经编辑了我的原始帖子。请看一下。谢谢!
  • 很抱歉,但还是同样的错误信息usermod: the group »max adm cdrom sudo dip plugdev lpadmin lxd sambashare« doesn't exist
  • @vonspotz 请编辑您的问题以包含您运行的确切命令,以便我们查看。
【解决方案2】:

关键问题是您需要告诉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 命令行。

【讨论】:

  • 是的,对,组 max 不应该被包括在内,但我想我会扼杀添加到用户组 max 的问题,直到其余的至少可以工作。我也可以手动删除一个组,但我不明白为什么我不应该使用 bash 来添加一组组。
  • 我并不是说不要使用 Bash。我是说如果您实际上使用sh,请不要使用Bash 功能。但是这个答案并没有尝试使用数组或其他 Bash 功能,所以它应该可以正常工作。
  • 很抱歉,但仍然出现与以下相同的错误消息 :( 它只是没有按照实际情况拆分参数。xargs 的其他目的是什么。
  • 在 Linux 上,您可能需要添加 --delimiter ' ' 并且可能需要添加 -r
【解决方案3】:

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

所以试试

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

【讨论】:

  • 不知道怎么回事,但它仍然抱怨max adm cdrom sudo dip plugdev lpadmin lxd sambashare 组不存在。不过感谢您的回复!
  • 好的,试试 -I(大写字母 i)而不是 -i,后者现在已被弃用。
  • Group {} doesn't exist.耶稣,我真的不知道这里出了什么问题
  • -i 只是为-I {} 提供便利,这与您已经在做的类似。这是一条红鲱鱼。
猜你喜欢
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2013-01-14
  • 1970-01-01
  • 2017-01-02
  • 2014-01-04
相关资源
最近更新 更多