微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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,请限制一次消耗的参数数量为一个 ({ {1}}):

-n 1
,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?