Как добавить пользователей из данных в текстовом файле

Как добавить пользователей из данных в текстовом файле

У меня есть вопрос о создании нескольких пользователей в Linux, но мне нужна программа для работы с этим. Есть новый файл users txt, содержимое которого следующее:

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

... (в файле 70 имен пользователей)

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

решение1

Допустим, ваш файл называется просто file. Этот скрипт выполнит эту работу:

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"

решение2

Это минимальный скрипт для выполнения работы. Он гарантирует, что ни имя пользователя, ни uid еще не используются. Он создает соответствующую группу для каждого пользователя (с gid=uid) — он не проверяет, существует ли уже gid или имя группы (оставлено в качестве упражнения для читателя — подсказка: используйте getent group).

Примечание: приведенный ниже скрипт не тестировался, но я уже писал подобные скрипты миллион раз (небольшое преувеличение)....могут быть некоторые незначительные ошибки, которые необходимо исправить.

#! /bin/bash
# get newusers file from first arg on cmd line or default to 'newusers.txt'
nf="${1:-newusers.txt}"

# 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"

Используйте pwgenили makepasswordлюбую подобную программу, если makepasswdона не установлена. Или напишите свою собственную, которая объединяет 4+ случайных слова из 5+ букв, чтобы получить легко запоминающийся пароль длиной не менее 20 символов — пишите некоторые слова заглавными буквами и вставляйте случайные числа из 1-3 цифр и/или знаки препинания между каждым словом, чтобы сделать пароль еще длиннее и увеличить область поиска методом перебора. Генерация случайных паролей — это то, что было изобретено много раз.

Вы можете распечатать имена пользователей и пароли (из "$tf") и разрезать их на полоски (оставьте несколько пустых строк между каждой user:password), чтобы раздать каждому пользователю. Попросите их немедленно сменить пароль и уничтожьте полоску бумаги. Срок действия паролей ограничен "$yesterday"(требуется GNU date), поэтому пользователям следует предложить сменить их при первом входе в свою оболочку.

решение3

Есть более простой способ добавлять или обновлять пользователей из файла в пакетном режиме: команда newusers(8), предоставляемаятеньtool swite. Набор инструментов должен быть доступен как пакет как минимум для Debian и производных. Он доступен в Arch Linux, который я использую.

Информацию о том, как его использовать, см.man newusers

Связанный контент