Linux 批量将多个用户分配到多个组
我有两个文本文件,users.txt和groups.txt,分别包含1000个用户和50个组。我想运行一个命令,将30个用户添加到每个组(例如:用户1-30添加到组1,用户31-60添加到组2,等等)。最实际的方法是什么 这就是我到目前为止所做的: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;
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
的末尾,break退出循环groups.txt
- 使用
作为索引,计算$line\u no
的起始行号和结束行号users.txt
- 调用
打印这些行之间sed(1)
中的所有行users.txt
- 该用户名列表通过管道传输到
,它为每个用户名运行xargs(1)
,并将其附加到上面的usermod(8)
$group\u name
开关告诉'-r'
如果用户名/stdin为空,则不要运行xargs(1)
usermod(8)
编辑:用换行符替换分号以提高易读性如果您展示了迄今为止所做的工作,并解释了您遇到的具体问题,您将获得更好的帮助。请看这正是我要找的。非常感谢。不过要明确的是,如果我想为每个用户设置密码,我应该运行我已经拥有的命令(在我对原始帖子的编辑中)还是有办法在此脚本中分配密码(可能是随机的)?用于以非交互方式更改密码。