批量将多个用户分配给多个组

时间:2019-01-23 13:57:01

标签: linux bash fedora

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

这是我到目前为止所拥有的:

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

1 个答案:

答案 0 :(得分: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的结尾并中断退出循环
  • 使用users.txt作为索引来计算$line_no的开始和结束行号
  • 调用sed(1)在这些行之间打印users.txt中的所有行
  • 该用户名列表通过管道传递到xargs(1)中,后者针对每个单个用户名运行usermod(8),并将其从上方附加到$group_name上。如果用户名/标准输入为空,'-r'开关会告诉xargs(1)不要运行usermod(8)

编辑:为了便于阅读,将分号替换为换行符