首页 > 解决方案 > 另一个文件 bash 脚本中的“adduser”有什么问题

问题描述

我被要求添加一些用户,他们的所有信息(密码、id、组 id ...)都存在于给定文件中。每当我运行我的 bash“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 文件的名称)

显示的错误消息是 :./project: line 43: useradd: command not found

这是输入文件“user”的内容:

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

标签: linuxbashdebianbash-it

解决方案


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

...
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,以及我们如何基本上总是用文件引用变量名字。通常,read -r除非您特别希望 shell 用反斜杠做有趣的事情,否则始终使用(这是与原始 Bourne shell 兼容的遗留行为)。

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

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

...等而不是运行

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上面的循环所做的。


推荐阅读