【问题标题】:Bulk Assign Multiple Users to Multiple Groups将多个用户批量分配给多个组
【发布时间】:2019-06-17 03:24:34
【问题描述】:

我有 2 个文本文件,users.txt 包含 1000 个用户的列表,groups.txt 包含 50 个组的列表。我想运行一个命令,将 30 个用户添加到每个组(例如:用户 1-30 到组 1,用户 31-60 到组 2,等等)。这样做最实用的方法是什么?

这是我目前所拥有的:

for i in `cat users.txt` ; do useradd $i; echo Pass$i | passwd $i -- stdin; done
for i in `cat groups.txt` ; do groupadd $i; done

【问题讨论】:

  • 如果您展示您目前所做的工作,并解释您遇到的具体问题,您将获得更好的帮助。请阅读How do I ask a good question?

标签: linux bash fedora


【解决方案1】:

假设您的文件每行有一个用户和一个组,这是一个伪单行器:

sed = groups.txt | while true ; do 
  read line_no
  read group_name
  [ -z $line_no ] && break
  (( from = (line_no - 1) * 30 + 1 ))
  (( to = line_no * 30 ))
  sed -n "${from},${to} p" users.txt | xargs -r -n 1 usermod -a -G $group_name 
done

此代码调用sed(1)groups.txt 中的每一行打印行号(以1 开头)和行本身(即组名),然后将输出通过管道输送到一个无限循环中,该循环执行以下操作:

  • 从管道输入中读取行号到$line_no变量中
  • 将组名从管道输入中读取到$group_name 变量中
  • 如果$line_no 为空,则假定我们已经到达groups.txt 的末尾并中断退出循环
  • 使用$line_no 作为索引计算users.txt 的开始和结束行号
  • 调用 sed(1) 以打印来自 users.txt 的所有行之间的行
  • 该用户名列表通过管道传输到xargs(1),它为每个单个用户名运行usermod(8),并将其附加到上面的$group_name'-r' 开关告诉 xargs(1) 如果用户名/标准输入为空,则不要运行 usermod(8)

编辑:用换行符替换分号以提高可读性

【讨论】:

  • 这正是我想要的。谢谢你。不过要明确一点,如果我想为每个用户设置密码,我应该运行我已经拥有的命令(在我对原始帖子的编辑中)还是有办法在这个脚本中分配密码(可能是随机的) ?
  • 使用this comment 以非交互方式更改密码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多