Linux 批量将多个用户分配到多个组

Linux 批量将多个用户分配到多个组,linux,bash,fedora,Linux,Bash,Fedora,我有两个文本文件,users.txt和groups.txt,分别包含1000个用户和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;

我有两个文本文件,users.txt和groups.txt,分别包含1000个用户和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

假设您的文件每行有一个用户和一个组,下面是一个伪oneliner:

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\u no
    变量中
  • 将组名称从管道输入读取到
    $group\u name
    变量中
  • 如果
    $line\u no
    为空,则假定我们已到达
    groups.txt
    的末尾,break退出循环
  • 使用
    $line\u no
    作为索引,计算
    users.txt
    的起始行号和结束行号
  • 调用
    sed(1)
    打印这些行之间
    users.txt
    中的所有行
  • 该用户名列表通过管道传输到
    xargs(1)
    ,它为每个用户名运行
    usermod(8)
    ,并将其附加到上面的
    $group\u name
    '-r'
    开关告诉
    xargs(1)
    如果用户名/stdin为空,则不要运行
    usermod(8)

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

如果您展示了迄今为止所做的工作,并解释了您遇到的具体问题,您将获得更好的帮助。请看这正是我要找的。非常感谢。不过要明确的是,如果我想为每个用户设置密码,我应该运行我已经拥有的命令(在我对原始帖子的编辑中)还是有办法在此脚本中分配密码(可能是随机的)?用于以非交互方式更改密码。