我正在尝试创建一个脚本,在该脚本中添加新用户和密码,并在Root中运行时检查该用户和密码是否已存在。
所以,我的脚本运行正常。它只在根目录中运行,并正确检查是否已使用用户名。但是,我似乎无法添加新的用户和密码。以下是我的整个脚本:
#!/bin/bash
#Creating a script that creates a new user
ROOT_UID=0 #Root has $UID 0
SUCCESS=0
E_USEREXISTS=70
E_NOTROOT=65 #Not root
#Run as root, and this checks to see if the creater is in root. If not, will not run
if [ "$UID" -ne "$ROOT_UID" ]; then
echo "Sorry must be in root to run this script"
exit $E_NOTROOT
fi
if [ $# -eq 2 ]; then
username=$1
pass=$2
grep -q "$username" /etc/passwd
if [ $? -eq $SUCCESS ]; then
echo "User $username already exists"
echo "Please choose another username"
exit $E_USEREXISTS
fi
echo $pass | passwd $username --stdin
echo "the account is setup"
else
echo "this program needs 2 arguments and you have given $#"
echo "you have to call the script $0 username and the pass"
fi
exit 0
我没有得到一个直接的错误,但这是一个正在发生的事情的例子: 我尝试添加某人(用户名然后密码):
[root@localhost Documents]# ./Script dkong 123bif
响应是:
passwd: Unknown user name 'dkong'
the account is setup
有人可以帮我指点吗?我希望它创建一个新的用户名和密码,我不明白为什么不是。
我使用脚本已经有一段时间了,所以如果答案显而易见,我很抱歉!只需要一点方向。提前谢谢!
答案 0 :(得分:3)
没关系!我搞定了! 这是我的解决方案:
useradd $username -d /home/$username -m ;
echo $passwd | passwd $username --stdin;
echo "the account is setup"
答案 1 :(得分:1)
错误在于,您需要在检查该行已经存在之后将用户名添加到/ etc / passwd' grep -q" $ username" / etc / passwd的' 因此,您只需添加该行' useradd $ username' 在第二个if条件之后 正好在该行之前' echo $ pass | passwd $ username --stdin' 发生错误是因为您告诉passwd为已经存在的用户设置密码
答案 2 :(得分:0)
首先,永远不要对用户变量使用完整的大写标识符,因为它们保留用于shell环境。
所以
ROOT_UID=0
应该是
root_uid=0 # and so on
创建用户名需要useradd
命令。它会自动执行后台检查以查看用户是否已经存在,如果是,则中止该过程,您只需检查命令的退出状态以查看用户创建是否成功。
您可以将用户名作为参数传递给脚本,但从安全角度来看,将密码作为纯文本传递并不好。 Linux密码存储为哈希值。散列算法可以是MD5,SHA-512等。您需要使用提及here的crypt
函数来帮助useradd
处理存储哈希密码。
下面是我的剧本
#!/bin/bash
# Checking pre-requirements, the script should contain one argument
[ -z "$1" ] && echo "Usage : script user_name" && exit 1
username=$1
# Read password key and has silently using -s ie keystrokes are invisible
read -sp 'Enter password key - ' key
# Typically ask for a confirmation, but omitted for the sake of brevity
# I suppose you default password hash algorithm is MD5
# You need some characters for a salt. Read the content in link mentioned above
read -sp 'Read upto 8 characters for salt - ' salt
# You can sanitize the user input for salt to trim its length to 8 and use it like below
useradd -m -d /home/$username \
-p $(perl -e 'print crypt("$ARGV[0]", "\$1\$$ARGV[1]")' "$username" "${salt:0:8}")
# Check the exit status of the last command
[ $? -eq 0 ] && echo "User $username successfully created" || \
echo "Sorry ! User $username couldn't be created at the moment"