我有一个username.txt
文件,其中包含他们的用户名和特定组。截至目前,我正在尝试创建一个 bash 脚本,该脚本允许我为每个用户创建一个帐户,并通过一个命令将用户添加到其组中。
这是目前我失败的 bash 脚本:
#!/bin/bash
sudo addgroup staff
sudo addgroup visitors
username="username.txt"
while read line; do
sudo useradd $-Eo '^[^,]+' $username;
if [grep staff $username]; then
sudo usermod -a -G staff
else
sudo usermod -a -G visitors
done < $username
这是我的文件中的内容username.txt
:
ellipsiscoterie,visitor
magnetcommonest,visitor
belateddefensive,staff
bobstercaramelize,staff
答案1
请尝试将此作为解决方案。您正在使用逗号分隔的文件,因此我的假设是您希望一次使用两个以上的组。您所做的并不是完全错误,但我会避免if
else
在这种情况下使用,因为它需要重写,以防需要更多组。组的创建也在循环内处理。
#!/bin/bash
while read config
do
USERTOCREATE=$(awk -F, '{print $1}' <(echo "$config"))
GROUPTOASSIGN=$(awk -F, '{print $2}' <(echo "$config"))
if [[ ! $(groups) =~ $GROUPTOCREATE ]]; then addgroup $GROUPTOASSIGN; fi
useradd $USERTOCREATE
usermod -a -G $GROUPTOASSIGN
done < users
此代码是一个简单的while
循环,使用两个变量USERTOCREATE
并GROUPTOASSIGN
使用 awk 进行分配。-F,
awk 中的 flag 是将字段分隔符FS
变量设置为逗号。这样 awk 可以将输入拆分为变量 $1 和 $2。我不确定您是否熟悉<()
这是一个文件描述符,它允许我们将 的输出echo "$config"
视为文件。$config
只不过是来自脚本正在读取的文件的行。
答案2
#!/bin/bash
i=0
n=$(wc -l <username.txt)
while [ $i -le $n ]
do
L=$(awk "NR==$i" username.txt)
if [ -n "$L" ]; then
user=$(echo "$L" | cut -d',' -f1)
group=$(echo "$L" | cut -d',' -f2)
useradd $user
groupadd $group
usermod -a -G $group $user
fi
i=$((i+1))
done
答案3
您可以username.txt
使用字段分隔符逐行解析,
:
#!/bin/bash
sudo addgroup staff
sudo addgroup visitors
while IFS=, read -r username maingroup
do
sudo adduser --ingroup "$maingroup" "$username"
done < username.txt
这会将逗号分隔的标记分别读入 shell 变量$username
和$maingroup
,并执行命令以创建具有主要组的adduser
用户。$username
$maingroup