我需要帮助完成一个 GCSE 项目,我被最后一个问题难住了。它要求使用 bash 脚本来创建用户,然后将他们分配到组中。我已经让脚本添加了新用户,但我不确定如何在 bash 脚本中将他们添加到组中(使用 制作的 bash 脚本nano
)。
有什么帮助/例子吗?
我当前的脚本:
#!/bin/bash
# Script to add a user to Linux system
if [ $(id -u) -eq 0 ]; then
read -p "Enter username : " username
read -p "Enter password : " password
egrep "^$username" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "$username exists!"
exit 1
else
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
useradd -m -p $pass $username
[ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
fi
else
echo "Only root may add a user to the system"
exit 2
fi
(看起来是这样的)
答案1
您可以使用这个修改后的脚本:
#!/bin/bash
# Script to add a user to Linux system
if [ "$(id -u)" -eq 0 ]; then
read -p "Enter username : " username
read -p "Enter password : " password
IFS=' ' read -a grps -p "Enter group names : "
if grep "^${username}:" /etc/passwd &>/dev/null; then
echo "$username exists!"
exit 1
else
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
if useradd -m -p "$pass" "$username" &>/dev/null; then
echo "User has been added to system!"
for grp in "${grps[@]}"; do
usermod -a -G "$grp" "$username" && echo "User is added to group $grp" \
|| echo "Failed to add user to group $grp"
done
else
echo "Failed to add a user!"
fi
fi
else
echo "Only root may add a user to the system"
exit 2
fi
请注意,您应该始终引用变量。
这里我主要添加了两件事:
IFS=' ' read -a grps -p "Enter group names : "
将要求 root 给出以空格分隔的组名,新创建的用户将成为该组的成员然后
for
对数组的值进行这个短循环grps
:for grp in "${grps[@]}"; do usermod -a -G "$grp" "$username" && echo "User is added to group $grp" \ || echo "Failed to add user to group $grp" done
假设组已经存在。如果不存在,您可以使用groupadd
创建组,然后将用户添加到该组。
这里我们习惯usermod
将用户添加到一个现有的组,这些组将成为该用户的补充组。
查看man usermod
详情。
请注意,您不应该使用egrep
,它已被弃用,取而代之的是grep -E
。事实上,在这种情况下您不需要grep -E
。
在某些情况下,您的grep
模式会失败,例如,如果您有一个用户foobar
,并且您正在添加一个名为 的新用户foo
。为了解决这个问题,请匹配用户名,后跟:
(假设没有用户名具有:
) :
grep "^${username}:" /etc/passwd &>/dev/null
也发送 STDERR 到/dev/null
。
这可以简化为:
if grep "^${username}:" /etc/passwd &>/dev/null; then
echo "$username exists!"
exit 1
else ......
下一个if
语句也useradd
可以跟在此之后。
**此外,还可以对当前脚本进行一些其他改进,但这些改进不适合此上下文。