linux - 另一个文件 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
解决方案
您的脚本将尝试将所有用户名提取到一个变量中,将所有主目录提取到一个变量中,等等。您希望循环输入文件并一次处理一个用户名和该行中的所有其他字段。
...
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
上面的循环所做的。
推荐阅读
- makefile - Makefile 文件将来自不同子文件夹的源匹配到单个构建文件夹中
- bash - 用于运行 chmod 并使用 badstr 跳过诡计的 Bash 脚本
- php - PHP 7.1 到 PHP 7.0,nginx 服务器上的错误
- python - 不返回对 YAML 文件的更新并在字符串更新时返回 TypeError
- c# - 没有文字转语音的 Nexmo 语音通话
- bazel - 从源文件路径派生 Bazel 标签
- python - 正则表达式在子字符串之前捕获所有内容
- python - Python Messenger Bot 仅适用于管理员,不适用于所有人
- git - Teamcity 仅从一个分支触发标签
- wordpress - Wordpress Multisite - API 帖子返回一个空数组