另一个文件 bash 脚本的"adduser"有什么问题



我被要求添加一些用户,他们的所有信息(密码、id、组id…(都存在于给定的文件中。每当我狂欢时"gedit";脚本,它给了我一个信息;找不到useradd命令";。如果有人能帮我,这是我的代码:

#!/bin/bash
choice=0
while [ $choice != "1" -a $choice != "2" -a $choice != "3" ]
do 
echo "What do you want to do"
echo "1-Add Users"
echo "2-Remove users"
echo "3-Update users"
echo -n "Enter choice : "
read choice
done
x=0
while [ $x -ne 1 ]
do
echo -n "Donner le fichier :"
read fichier
if test -f $fichier              # check if file ficher exists
then
x=1
else
echo "File not found"  
x=0
fi
done
if [ $choice == "1" ]
then
FILE="user"
USERNAME=$(cut -d ":" -f 1 $FILE)
PASSWORD=$(cut -d ":" -f 2 $FILE)
USER_ID=$(cut -d ":" -f 3 $FILE)
GROUP_ID=$(cut -d ":" -f 4 $FILE)
USER_INFO=$(cut -d ":" -f 5 $FILE)
HOME_DIRECTORY=$(cut -d ":" -f 6 $FILE)
SHELL=$(cut -d ":" -f 7 $FILE)
MIN=$(cut -d ":" -f 8 $FILE)
MAX=$(cut -d ":" -f 9 $FILE)
INACTIVE=$(cut -d ":" -f 10 $FILE)
WARNING=$(cut -d ":" -f 11 $FILE)

useradd -m -c "${USERNAME}" "${PASSWORD}" "${USER_ID}" "${GROUP_ID}" "${USER_INFO}" "${HOME_DIRECTORY}" "${SHELL}" "${MIN}" "${MAX}" "${INACTIVE}" "${WARNING}"
fi

为了调用脚本,我使用chmod u+x项目(这是gedit文件的名称(

显示的错误消息为:/项目:第43行:useradd:找不到命令

这是输入文件"的内容;用户":

charbel:password:1001:1001:Charbel Haddad:/home/charbel:/bin/bash:0:30:15:7:y
assil:p@ssw0rd:1002:1002:Assil:/home/assel:/bin/bash:0:30:10:5:n
marwan:p@ssw0rd:1003:1003:Marwan Ghantous:/home/marwan:/bin/bash:0:50:30:7:n
michel:password:1004:1004:Michel:/home/michel:/bin/bash:1:30:10:5:y

您的脚本将尝试将所有用户名提取到一个变量中,将所有主目录提取到一个子变量中,等等。您希望在输入文件上循环,并一次处理该行中的一个用户名和所有其他字段。

...
if [ $choice = "1" ]   # notice also single = not ==
then
while IFS=":" read -r username password user_id group_id 
user_info home_dir shell min max inactive warning
do
useradd -m -c "$username" "$password" "$user_id" "$group_id" 
"$user_info" "$home_dir" "$shell" 
"$min" "$max" "$inactive" "$warning"
done <"$fichier"
fi

还要注意read -r如何使用IFS的值作为字段分隔符,将一行拆分为多个字段,以及我们如何避免对私有变量使用大写。(我推测您忘记告诉我们您也设法覆盖了PATH。(

顺便说一句,脚本早期的while循环也可以从根本上简化:

while true
do
read -p "Donner le fichier :" -r fichier
test -f "$fichier" && break
echo "$0: $fichier: file not found" >&2
done

请注意,我们如何将错误消息打印为标准错误,并包括脚本的名称和找不到的文件的名称,以及read如何允许使用-p打印提示,以及我们如何基本上总是用文件名引用变量。通常,除非您特别希望shell使用反斜杠做一些有趣的事情,否则请始终使用read -r(这是与原始Bourne shell兼容的遗留行为(。

更详细地说,当你一次读取整个文件时,你会运行一个命令行

useradd -m -c "charbel
assil
marwan
michel" "password 
p@ssw0rd
p@ssw0rd
password"

etc而不是运行

useradd -m -c "charbel" "password" "1001" "1001" "Charbel Haddad" "/home/charbel" "/bin/bash" "0" "30" "15" "7" "y"

单独,然后

useradd -m -c "assil" "p@ssw0rd" "1002" "1002" "Assil" "/home/assel" "/bin/bash" "0" "30" "10" "5" "n"

一次从文件中输入一行,这就是上面的while IFS=":" read -r循环所做的。

最新更新