Как заставить мой скрипт bash автоматически присваивать уникальные имена пользователей новым пользователям?

#linux #bash #scripting

Вопрос:

Я новичок, пишущий сценарий bash, предназначенный для создания новых пользователей. Он запрашивает пользователя, следует ли создавать или удалять пользователей. При создании он спрашивает, сколько их, а затем добавляет пользователей с именем пользователя «user1», «user2» и т. Д. И файлом приветствия в их домашнем каталоге. Я сделал это, циклы работают, но они не будут повторяться, потому что, похоже, они путают целое число идентификаторов с количеством пользователей, которых ему нужно создать. Другими словами, если я сначала создам user1 и user2 с помощью этого скрипта, а затем снова запущу его, чтобы создать еще 1 или 2, он ответит «user1 уже существует» или «user2 уже существует», и он не создаст две новые учетные записи. Если я попрошу его создать 3 учетные записи, он создаст «user3», но ничего больше.

Мне нужно, чтобы он увидел, что пользователь1 и 2 приняты, а затем добавил 1 к имени пользователя и автоматически назначил «пользователь3» и «пользователь4» следующим двум созданным учетным записям и так далее. Цикл, в котором я создаю пользователей, таков:

 if [[ $NUMBER -lt 20 amp;amp; $ACTION == "create" ]]
then
        until [[ $NUMBER -eq 0 ]]
        do
           i=$(($i 1))
           USERNAM="user$i"
           useradd -s /usr/bin/bash -m $USERNAM;
           cat <<-EOF> /home/$USERNAM/welcome.txt
           Welcome to your new Linux account!
EOF
           let NUMBER=$NUMBER-1;
           done;
fi
 

Возможно, это не самый чистый способ достичь этого, но, похоже, он работает. Я попробовал несколько различных способов заставить его основываться на ранее созданных именах пользователей вместо того, чтобы пытаться перезаписать старые имена пользователей. Это моя нынешняя попытка:

 if id -u "$USERNAME" >/dev/null 2>amp;1;
then
        until [[ $NUMBER -eq 0 ]]
        do 
        i=$(($i  ))
        useradd...
 

Остальная часть этого цикла такая же, как и первая. Очевидно, что это не работает. Может ли кто-нибудь сказать мне, как написать этот скрипт таким образом, чтобы он автоматически добавлял 1 к существующему имени пользователя для любых новых учетных записей, которые он создает?

Комментарии:

1. Просто не добавляйте пользователя, если USERNAM он уже занят!

Ответ №1:

Просто сделай еще одну петлю вокруг

            i=$(($i 1))
           USERNAM="user$i"
 

чтобы пропустить существующих пользователей:

           while
            i=$(($i 1))
            USERNAM="user$i"
            id $USERNAM
          do :
          done
 

Комментарии:

1. Я предполагаю, что код useradd следует за do в этом цикле while. Когда я запускаю такой скрипт, он говорит идентификатор: «пользователь1»: такого пользователя нет как для пользователя 1, так и для пользователя 2. Поэтому он застревает на идентификаторе. Могу ли я добавить условие или что-то в этом роде, например, если пользователь не существует, создать пользователя? Или я неправильно использовал цикл while?

2.Вы предполагаете, что ошибаетесь — код useradd следует done . Как он может сказать id: «пользователь 1«: такого пользователя нет для 2? Что вы имеете в виду, когда говорите, что он застревает на удостоверении личности? После того , как он скажет no such user , он переходит к useradd и добавляет этого пользователя. Вы проверили, существуют ли пользователи после этого?

3. Извините, я хотел сказать, что «пользователь1»: такой пользователь не отображается для каждого вновь добавленного пользователя, но меняется на «пользователь2» или «пользователь3», в зависимости от того. Я исправил скрипт и разместил код useradd после завершения, и теперь он работает! Я запустил его для 3 новых пользователей, а затем были созданы 2 новых пользователя и 1-5 пользователей, так что это работает! Он показывает мне вывод «id: такого пользователя нет», что не обязательно является проблемой, но я попытаюсь перенаправить этот вывод, чтобы он не отображался. Это просто подтверждение того, что идентификатор был выполнен, а пользователь не существует, прежде чем сценарий продолжит создавать этого пользователя, как вы упомянули. Большое спасибо!