В чем проблема с моим «adduser» из другого файла bash script
Меня просят добавить некоторых пользователей со всей их информацией (пароль, идентификатор, идентификатор группы ...), присутствующей в данном файле. Всякий раз, когда я запускаю свой скрипт 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: строка 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
1 ответ
Ваш сценарий попытается извлечь все имена пользователей в одну переменную, все домашние каталоги в одну переменную и т. д. Вы хотите перебрать входной файл и обработать одно имя пользователя и все остальные поля из этой строки за раз.
...
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
Обратите также внимание, как можно разделить строку на поля, используя значение
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
если вы специально не хотите, чтобы оболочка делала забавные вещи с обратной косой чертой (это устаревшее поведение для совместимости с оригинальной оболочкой Bourne).
Более подробно, когда вы читаете весь файл за один раз, вы запускаете командную строку
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
петля выше делает.