我基本上试图编写一个简单的脚本,以允许交互式使用“useradd”和选择选项。
我试图允许特定用途的选项要么以交互方式定义,要么设置为下一个可用或默认设置。
我遇到的主要问题是如何获取组 id 和组等值的下一个可用值。
我想我可以为主目录和 shell 设置预设值,但我想找出除了为这些变量设置常量之外是否有一种不那么暴力的方法。
到目前为止,我已经做到了这里:
#!/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
read -p "Enter group id or [default to next available]: " gid
read -p "Enter additional groups or [default to next available]: " group
read -p "Enter home directory or [default to next available]: " hdir
read -p "Enter desired shell or [default to next available]: " difshell
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 -p$pass -g$gid -G$group -d$hdir -s$difshell $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
我不知道 $HOME 和 $SHELL 变量的“下一个可用”是什么意思。您刚刚设置为默认值的那些:/home/USERNAME
或者/bin/bash
其他什么。对于$HOME
,只需确保该目录不存在 ( [ -e "/home/$username" ] && echo "Directory exists"
)。
至于组,只需列出可用的组并选择下一个即可。这Debian 的群组政策(我相信这不仅限于 Debian)规定普通用户的 GID 应该在 1000 到 5999 之间。因此,您需要做的就是 parse /etc/passwd
,打印该范围内的现有组,然后添加一个:
grp=$(awk -F: '$4>=1000 && $4<6000{print $4+1}' /etc/passwd | sort -n | tail -n1)
如果第四个分隔字段的值在 1000 到 6000 之间,该awk
命令将打印该字段的值:
加 1。然后对其进行排序并保留纬度线。结果是 GID 比当前最大的 GID 大 1。