Скрипт добавления пользователей linux

How to add users from data in a text file

I have a question about creating multiple users in linux, but I need a program to work on it. There is a new users txt file, the content is following:

adams:5000:Adams, John Couch:/bin/bash atiyah:5001:Atiyah, Michael:/bin/csh babbage:5002:Babbage, Charles:/bin/csh baker:5003:Baker, Alan:/bin/csh barrow:5004:Barrow, Isaac:/bin/bash 

. (there are 70 users name in the file) I would like to know how to write a script to add those users automatically.

What have you tried? We aren’t going to write it for you, just help you figure out what is wrong with the script you are writing.

Your input is really close to a password file entry, but you could use your distribution’s built-in useradd (or similar) command with parameters extracted from the input.

just a little hint: you can read a file line by line using the read command in a while loop. then, you can split up the stuff using awk, like this: echo $line | awk -F: ‘‘ . Finally, use the useradd command like JuliePelletier suggested

3 Answers 3

Lets say your file is named just file . This script will do the job:

USERNAME=$(cat file | cut -d: -f1) echo "$USERNAME" ID=$(cat file | cut -d: -f2) echo "$ID" USER_SHELL=$(cat file | cut -d, -f2 | cut -d: -f2) echo "$USER_SHELL" useradd -m -s "$USER_SHELL" -u "$ID" "$USERNAME" 

(0) UUOC. (1) The OP says that the input file lists specifications for 70 users. So what is the output from cut -d: -f1 file going to be? (Spoiler alert: it’s going to be a list of 70 usernames.) (2) Why cut -d, -f2 | cut -d: -f2 ? The question says that the file lists 70 users, but shows only 5 lines, so obviously that is just example input. What if the next line is cher:5005:Cher:/bin/bash ? Not every name will include a comma. Why not just do the obvious cut -d: -f4 and leave the comma alone? (3) And why are you not doing cut -d: -f3 and getting the user full name?

This is a bare minimum script to get the job done. It makes sure that neither the username nor the uid is already in use. It makes a matching group for each user (with gid=uid) — it doesn’t check if the gid or group name already exists (left as an exercise for the reader — hint: use getent group ).

Note: the script below is untested but I’ve written scripts a lot like it a million times before (slight exaggeration). there may be some minor bugs that need fixing.

#! /bin/bash # get newusers file from first arg on cmd line or default to 'newusers.txt' nf="$" # get existing usernames and uids. names="^($(getent passwd | cut -d: -f1 | paste -sd'|'))$" uids="^($(getent passwd | cut -d: -f3 | paste -sd'|'))$" yesterday=$(date -d yesterday +%Y-%m-%d) # temp file for passwords tf=$(mktemp) ; chmod 600 "$tf" while IFS=: read u uid gecos shell; do gid="$uid" ; homedir="/home/$u" useradd -e "$yesterday" -m -d "$homedir" -c "$gecos" \ -u "$uid" -g "$gid" -s "$shell" "$u" groupadd -g "$gid" "$u" # generate a random password for each user.. p=$(makepasswd) echo "$u:$p" >> "$tf" done < <(awk -F: '$1 !~ names && $2 !~ uids' names="$names" uids="$uids" "$nf") # uncomment to warn about users not created: #echo Users not created because the username or uid already existed: >&2 #awk -F: '$1 ~ names || $2 ~ uids' names="$names" uids="$uids" "$nf" >&2 # uncomment the cat to display the passwords in the terminal echo ; echo "passwords are saved in $tf" # cat "$tf" # set passwords using `chpasswd: chpasswd < "$tf" 

Use pwgen or makepassword or any similar program if makepasswd is not installed. Or write your own that concatenates 4+ random 5+ letter words to get an easy to remember password at least 20 characters long - capitalise some words and insert random 1-3 digit numbers and or a punctuation symbol between each word to make the password even longer and increase the brute-force search space. Random password generation is something that has been re-invented many times.

You can print out the usernames and passwords (from "$tf" ) and cut them into strips (leave a few blank lines between each user:password ) to give to each user. Tell them to change their password immediately and destroy the strip of paper. The passwords are set to expire "$yesterday" (requires GNU date ), so the users should be prompted to change them the first time they login to their shell.

Источник

Adding users from text file [duplicate]

I tried that just now but when I checked my list of users the users were not there. In 'users.txt' there are a list of usernames only such as 'bdrake'.

See how the closing quote is overwriting the first character of the error message? That means you have a carriage return (\r) in your file: do dos2unix users.txt

1 Answer 1

You do not give us insights about you particular task and about contents of users.txt file, but I could give a few recommendations that will eliminate simple problems.

Always surround all variables with double quotes " in bash scripts. This simple trick help to avoid a lot script problems. In your particular case replace all $i with "$i" .

Always add double dash -- at the end of command line to signify the end of command options. It helps to avoid problems when positional parameter has - as a part of its string. Finally the line with useradd command will look like:

$ sudo useradd -m -s /bin/bash -G interns -- "$i" 

Consider that usernames should satisfy the constraints. It depends on particular Linux distribution, here is quote from man useradd of Ubuntu 14.04

 It is usually recommended to only use usernames that begin with a lower case letter or an underscore, followed by lower case letters, digits, underscores, or dashes. They can end with a dollar sign. In regular expression terms: [a-z_][a-z0-9_-]*[$]? On Debian, the only constraints are that usernames must neither start with a dash ('-') nor plus ('+') nor tilde ('~') nor contain a colon (':'), a comma (','), or a whitespace (space: ' ', end of line: '\n', tabulation: '\t', etc.). Note that using a slash ('/') may break the default algorithm for the definition of the user's home directory. Usernames may only be up to 32 characters long. 

And finally read this to be aware of other common mistakes.

Also take a look to newusers utility, it might be easier if you have tons of users to create.

Источник

32. bash скрипты №6

В прошлый раз мы научили наш скрипт вытягивать информацию о пользователях из файла. Всё это для того, чтобы наш скрипт был более самостоятельным. Но создавая пользователей вручную, мы можем предварительно проверить, занят ли такой логин, и, в случае чего, создать пользователя с другим логином. Попробуем научить скрипт делать также.

Я немного изменил файл с пользователями. Предположим, так получилось, что у нас 4 тёзки и мы отличаем их по дням рождения и группам.

Конвертируем файл в csv формат:

libreoffice --headless --convert-to csv users.xlsx cat users.csv 

Немного подправим cut, с помощью которого мы брали информацию из csv файла – добавим в него поле 4, чтобы также вытягивать информацию о днях рождения. Проверим в терминале:

cut -d, -f2,3,4,5 users.csv | tail -n +2 | tr '[:upper:]' '[:lower:]' | tr , ' ' 

Как видите, информация о группе сместилась на 4 столбик, поэтому подправляем это в скрипте:

group=$(echo "$line" | cut -d' ' -f4)

Добавляем ещё одну переменную – bday – в которой и будет информация о дне рождения:

Ну и чтобы использовать эту переменную, добавим в нашу функцию create_user в саму команду useradd опцию -c - то есть комментарий:

Пока мы только подготовились к тому, чтобы различать тёзок после их создания. Если мы сейчас просто запустим скрипт, useradd не создаст пользователей с одинаковыми логинами. И так, наша задача - скрипт перед созданием пользователя должен проверить, есть ли уже такой логин, и, если есть, создать пользователя с другим логином. Но, конечно, нужно ещё проверить, а не занят ли тот второй логин. Если мы будем проверять просто с помощью if, мы увидим, что есть пользователь b.wayne и создадим пользователя b.wayne2. А если он уже занят? Чтобы проверить, а не занят ли логин b.wayne2, нам придётся написать elif. Тогда мы укажем b.wayne3. А если и он занят? Сколько раз нам придётся писать условие? Мы не можем этого знать. Нам нужно проверять условие до тех пор, пока мы не получим нужный результат.

Для этого у нас есть команда while – комбинация условия и цикла. Пока выполняется условие, будет выполняться цикл. Синтаксис такой:

while условие do команда done 

Как мы помним, условие – это просто любая команда, главное статус её выхода – 0, или что-то другое. Например:

while [ -f file ] do echo file exists done 

То есть, пока файл есть, echo будет писать такой текст. Попробуем создать файл:

и запустить команду. Как видите, команда echo постоянно выдаёт текст.

while получил код выхода 1 и закончил свою работу.

С while часто используют инкремент. Это такая операция увеличения переменной. Например, берут переменную i и перед циклом дают ей какое-то значение, например 1. Во время выполнения цикла её значение увеличивают. То есть при каждой итерации значение переменной будет увеличиваться. Увеличивать значение в bash-e можно по разному, хоть с помощью математических операций, так и используя специальный оператор ++:

С помощью «–» можно, соответственно, уменьшать значение. Заменим echo, чтобы видеть значение переменной:

и попробуем запустить скрипт:

Как видите, очень быстро переменная достигла больших значений, а значит while сделал столько итераций.

Можно, кстати, использовать команду sleep, чтобы заставить скрипт подождать сколько-то секунд, прежде чем выполнить следующую команду:

Как видите, теперь итерация происходит раз в секунду:

Хорошо, попробуем применить while к нашей задаче. Для начала напишем условие проверки наличия логина. В прошлый раз я показал, как с помощью grep-а найти нужный логин в passwd, сделаем также. Для тестов укажем переменную user=o.queen. Условие в while поставим проверку наличия пользователя:

while cut -d: -f1 /etc/passwd | grep -w $user

Таким образом мы проверяем, есть ли пользовать в passwd и, если есть, запускаем команды внутри цикла. Сделаем так, чтобы команда внутри цикла меняла значение переменной:

то есть o.queen превратится в o.queen1. Переменная i станет 2:

Убираем sleep, он нам не нужен. Попытаемся прочесть наш цикл. При запуске скрипта while проверяет, есть ли пользователь o.queen в passwd. Если он нашёл такого пользователя, значит условие выполнилось. Если условие выполнилось, значит while запускает команды – сначала он меняет значение переменной user на o.queen1. Затем он меняет значение переменной i на 2. Происходит итерация – теперь while ищет в passwd пользователя o.queen1. Если он не находит - цикл заканчивается, значение переменной остаётся o.queen1 и запускаются следующие команды. Если же он нашёл юзера o.queen1, то переменная становится o.queen2, переменная i становится 3 и так до тех пор, пока grep не скажет, что такого пользователя нет. Давайте в конце выведем полученное значение переменной:

Как видите, теперь переменная user стала o.queen1, а дальше можно эту переменную использовать для создания пользователя. Ну и чтобы не видеть вывод команды grep, просто направим его в /dev/null:

Хорошо, теперь скопируем полученный цикл и вставим его в наш скрипт. Сделаем это в виде функции – check_user:

Ну и укажем эту функцию в нашем цикле for, который создаёт пользователей из файла.

Сохраним, скопируем новый файл users.csv в директорию /var/:

sudo ./myscript tail -5 /etc/passwd 

Как видите, для всех тёзок создались аккаунты, хотя логины получились не такими, как мы ожидали. Почему так получилось и как это исправить – это задача для вас.

Напоследок, рассмотрим команду until. Если в while цикл продолжает работать пока условие верно, то есть код выхода условия 0, то в until наоборот – цикл будет работать пока условие неверно, то есть код выхода не 0. То есть, условно, while - пока всё хорошо, делать что-то. А until – пока не станет хорошо, делать что-то. Синтаксис практически одинаковый:

until [ -f file ] do echo file does not exists done 

Дадим права, удалим файл и попробуем запустить:

chmod +x until rm file ./until 

Как видите, скрипт говорит, что файла нет.

То есть, пока не выполнится условие, пока не появится файл:

until будет продолжать работать.

Но, как мы помним, мы можем использовать тот же while с восклицательным знаком:

что даст, по сути, тот же результат. Разве что читать скрипт с until где-то проще, вместо того, чтобы обращать значение while.

В этот раз мы с вами разобрали while и until. Можно наткнуться на различные способы использовать тот же while, until, for и другие команды. Но если понимать, что, допустим, тому же while нужен статус выхода и безразлична сама команда, то многие способы применения станут понятнее. Со скриптами мы сделаем перерыв, так как много других важных тем, но, я надеюсь, что вы стали лучше понимать, что такое скрипты, как их читать и писать. Для примера, постарайтесь прочитать те же файлы /etc/bashrc и /etc/profile, которые мы разбирали раньше. Это просто скрипты, которые выполняются при запуске bash-а. Возможно вам неизвестны все ключи – но это нормально, всегда можно обратиться к документации.

© Copyright 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия 5f665cc2 .

Источник

Читайте также:  Rtnetlink answers file exists linux
Оцените статью
Adblock
detector