8.17. Серийное добавление новых пользователей

Проблема
Требуется добавить сразу несколько учетных записей (вместо того, чтобы вво дить их по одной).
Решение
Воспользуйтесь сценарием mass_useradd. Это сценарий командного процессора,
поэтому он должен работать практически везде. Вам также понадобится сценарий
mass_passwd (листинг 8.2). Сохраните эти два сценария в одном каталоге. Также
следует установить утилиту pwgen, генерирующую пароли. Создайте список имен
и паролей в формате:
имя_пользователя: имя фамилия
Также можно добавить дополнительные данные GECOS:
dawns:Dawn Marie Schroder,,123-4567,trainers
Затем запустите сценарий mass_useradd (листинг 8.1). Сценарий создает записи
в /etc/passwd, /etc/group и /etc/shadow, домашние каталоги, персональные группы
и пароли, которые становятся недействительными после первого использования.
Следующая команда приказывает mass_useradd использовать список новых
пользователей из файла newusers с заменой/созданием выходного файла newLogins.txt:
sh mass_useradd < newusers > newlogins.txt
Присоединение новых имен и паролей к файлу newlogins.txt:
sh massuseradd < newusers » newlogins.txt
Помимо выходного файла, который представляет собой обычный список,
mass_passwd создает для каждого пользователя отдельный файл с инструкциями.
Инструкции распечатываются и раздаются пользователям. Эти файлы, а также
файл журнала хранятся в домашнем каталоге пользователя, запустившего сцена рий (обычно root):
# Is /root/mass passwds
dawns.passwd.txt nikitah.passwd.txt mass_passwd.log rubst.passwd.txt
Комментарий
В сценариях используются стандартные средства Shadow Suite, поэтому они лег ко настраиваются посредством регулировки параметров утилит, задействованных
в их работе.
Файл выходных данных выглядит так:
dawns shabaefi 1002
nikitah gohbinga 1003
rubst ahtoohaa 1004
В файл /etc/passwd добавляются записи вида
dawns:x:1002:1002:Dawn Mari Schroder,.123-4567,trainers:/home/dawns:/bin/bash
nikitah:x:1003:1003:Nikita Horse..123-4567,equine:/home/nikitah:/bin/bash
rubst:x:1004:1004:Rubs The Cat.101,,234-5678.,test:/home/rubst:/bin/bash
Листинг 8.1. Программа mass_useradd
#!/bin/sh
##
# Использование:
# # sh mass_useradd < inputfile » new-passwords.txt
##
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:$PATH
# Чтение строки входных данных.
# Формат входного файла: продолжение #
126 Глава 8. Управление пользователями и группами
Листинг 8.1 {продолжение)
# имя_пользователя : имя фамилия
# Чтобы в качестве разделителя использовалась запятая, замените
# IFS=":$IFS" на IFS=",$IFS"
while IFS=":$IFS" read username realname; do
# Сначала удаляем пустые строки и комментарии
case "Susername" in
'' | \#*) continue ;:
esac
# Чтение /etc/passwd и /etc/group и вычисление
# следующих свободных значений UID and GID.
# Программа начинает с {id=1000}, измените для своей системы
id=$({ getent passwd: getent group; } | cut -f3 -d: | sort -un
awk 'BEGIN { id=1000 }
$1 == id { id++ }
$1 > id { print id: exit }')
# Добавление новых пользователей в /etc/group и /etc/passwd.
# Создание домашних каталогов командой chmod 700
# Все параметры groupadd, useradd и chmod
# можно изменить в соответствии со спецификой системы.
groupadd -g $id Susername
useradd -m -c "$realname" -g $username -u $id Susername
chmod 700 /home/$username
# Назначение пароля. Для этой цели вызывается другой сценарий
# mass_passwd. который может использоваться независимо.
# Сценарий mass_passwd выводит имя пользователя, пароль
# и идентификатор пользователя.
$(dirname $0)/lmass_passwd -M Susername
done
Листинг 8.2. Программа mass_passwd
#! /bin/sh
# Каталог для сохранения файлов "username.passwd.txt"
# Если каталог не существует, он будет создан.
text_file_dir=$HOME/mass_passwds
log_file=mass_passwd.log
## Минимальный идентификатор для "обычных" пользователей
min_uid=1000
# Длина генерируемых паролей
pass_len=8
## Срок действия паролей (в днях)
pass_expire=90
# При желании отредактируйте текст между двумя строками
# Получение имени программы (скорее всего. "mass_passwd")
prog=${0##*/}
usage О {
echo "usage: $prog [-v] [-n] username ..."
echo " $prog [-v] [-n] [-g] groupname ..."
echo " $prog [-v] [-n] [-a]"
echo " -g change passwords of everyone in a group"
echo " -a change everyone's password"
echo " -v verbose"
echo " -n don't do i t . just simulate (implies -v)"
e x i t 0
short_usage 0 {
echo >&2 "usage: $prog [-v] [-g] [-a] name..."
echo >&2 " $prog -h for help"
e x i t 1
# echo something, but only i f in verbose mode
vecho О {
test -n "Sverbose" && echo "$(?"
}
# Построение случайного пароля.
ж
# Если программа pwgen доступна, используем ее -- она для этого
# предназначена и хорошо работает.
#
# Если программа недоступна, читаем /dev/urandom и отфильтровываем все
# символы, не являющиеся алфавитно-цифровыми, пока количество символов
# не окажется достаточным для пароля. Символы в "tr -d" определяют
# ASCII-коды (в восьмеричной записи) диапазонов удаляемых символов.
#
# Подобное использование /dev/urandom крайне неэффективно.
# но это несущественно,
randompass О {
pwgen $pass_len 1 2>&- ||
tr -d '[\000-\057][\072-\100][\133-\140][\173-\377]' < /dev/urandom |
dd bs=$pass_len count=l 2>& }
# Функция интерпретирует режим (пользователи / группы / серийная замена)
# и возвращает список имен пользователей
get_users О {
if [ -n "$all_mode" ]; then
getent passwd | awk -F: '{if ($3 >= '$min_uid') (print $1}}'
return
if [ -z "$group_mode" ]: then
echo "$@"
return
while [ -n "$1" ] : do -,
g_ent=$(getent group "$1" 2>&-)
i f [ -z "$g_ent" ] : then
echo >&2 "warning: $1: group not found"
continue
fi
members=${g_ent##*:}
gid=${g_ents;:*}
gid=${gid##*:}
echo "$members" | tr '.' ' '
getent passwd | awk -F: '{if ($4 == '$gid') { print $1 } }'
shift
done
# Основной код
group_mode=; verbose^; all_mode=: simulate»: eol = ;
while [ -z "$eol" ]: do
case "$1" in
-g) group_mode=l: shift ::
-v) verbose=l: shift ;:
-a) all_mode=l: shift ::
-n) simulate=true: verbose=l: shift :;
-M) mass_out=l; shift :: # we're called from massjjseradd
-h | -? | --help) usage ;:
--) eol-1; shift ::
-*) short_usage :;
*) eol=l ::
esac
done
# Настройка безопасного окружения и каталога для текстовых файлов.
# предназначенных для вывода на печать.
PATH=/usr/sbin:/usr/bin:$PATH
umask 077
mkdi г -р $text_file_dir
cd $text_file_dir
processed=0
for u in $(get_users "$@"); do
vecho -n "generating password for $u..."
pass=$Crandompass)
echo "$u:$pass" | eval Ssimulate chpasswd
vecho -n "."
eval Ssimulate спаде -M $pass_expire -d 2003-01-01 $u
vecho -n "."
rm -f Su.passwd.txt
echo > Su.passwd.txt "\
Login name: $u
Password: Spass
Please log in and change your password: the system should
prompt you to do this when you log in. You can change your
password at any time with the 'passwd' command.
Choose a strong password - everyday words, birthdays,
names of people or animals, all these are too easy to guess.
Also, DO NOT give your password to anyone, ever. The IT
staff will never ask you for your password, and neither
should anyone else. You will be held responsible for all
activity done via your account.
_ —"
printf » $log_file "$(date) S!-12s XsWn" $u $pass
vecho "Spass"
if [ -n "$mass_out" ]; then
uid=$(getent passwd $u | cut -f3 -d:)
echo -e "$u\\t$pass\\t$uid"
processed=$(expr $processed + 1)
done
i f [ $processed -gt 0 ] : then
test -z "$mass_out" &&
echo >&2 "Sprocessed password(s) reset - see $text_file_dir/$log_file"
else
echo >&2 "no users specified - see '$prog -h' for help"
fi
См. также
bash(l), pwgen(l); домашняя страница программы pwgen (http://sourceforge.net/
proiects/pwgen/).