Управление пользователями и группами
допускаются. Рекомендуется использовать сильные пароли, то есть не выбирать в качестве пароля имена, слова из словаря, дни рождения или адреса. Пароли рекомендуется записывать и хранить в надежном месте. К сожалению, многие пользователи выбирают слабые, легко угадываемые пароли или хранят их в небезопасных местах (например, на записке, прикрепленной к монитору).
Пароли Linux не восстанавливаются. При потере пароля следует обратиться к суперпользователю для получения нового пароля.
См. также passwd(1), passwd(5).
Adding new group squid (109). Adding new user squid (109) with group squid Not creating home directory
Проверьте результат:
# cat /etc/passwd | grep squid squid:x:109:109::/home/squid:/bin/false
Хотя подстрока /home/squid присутствует, домашний каталог не создается.
А вот как то же самое делается в useradd:
# useradd -d /dev/nuil -g squid -s /bin/false squid
Листинг 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 $username chmod 700 /home/$username # Назначение пароля. Для этой цели вызывается другой сценарий # mass_passwd. который может использоваться независимо. # Сценарий mass_passwd выводит имя пользователя, пароль # и идентификатор пользователя. $(dirname $0)/lmass_passwd -M $username 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 ###################################################################### ## При желании отредактируйте текст между двумя строками ----------.
usage () { echo "usage: $prog [-v] [-n] username ..." echo " $prog [-v] [-n] [-g] groupname ..." echo " $prog [-v] [-n] [-a]" echo " -g change passwords of everyone ina group" echo " -a change everyone's password" echo " -v verbose" echo " -n don't do it, just simulate (implies -v)" exit 0 }
short_usage () { echo >&2 "usage: $prog [-v] [-g] [-a] name..." echo >&2 " $prog -h for help" exit 1 } # echo something, but only i f in verbose mode vecho () { test -n "$verbose" && 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 fi if [ -z "$group_mode" ]; then echo "$@" return fi while [ -n "$1" ]; do
продолжение ==>
Листинг 8.2 {продолжение)
g_ent=$(getent group "$1" 2>&-) if [ -z "$g_ent" ]; then echo >&2 "warning: $1: group not found" continue fi members=${g_ent##*:} gid=${g_ent%:*} 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=1; shift ;; -v) verbose=1; shift ;; -a) all_mode=1; shift ;; -n) simulate=true; verbose=1; shift ;; -M) mass_out=1; shift ;; # we're called from mass_useradd -h | -? | --help) usage ;; --) eol=1; shift ;; -*) short_usage ;; *) eol=1 ;; esac done # Настройка безопасного окружения и каталога для текстовых файлов. # предназначенных для вывода на печать. PATH=/usr/sbin:/usr/bin:$PATH umask 077 mkdir -р $text_file_dir cd $text_file_dir
processed=0 for u in $(get_users "$@"); do vecho -n "generating password for $u..." pass=$(randompass) echo "$u:$pass" | eval $simulate chpasswd vecho -n "." eval $simulate chage -M $pass_expire -d 2003-01-01 $u vecho -n "."
rm -f $u.passwd.txt echo > $u.passwd.txt "\ ---------------------------------------------------------------------- Login name: $u Password: $pass Please log in and change your password: the system should prompt you to do this when you log in. You can change your
if [ $processed -gt 0 ]; then test -z "$mass_out" && echo >&2 "$processed password(s) reset - see $text_file_dir/$log_file" else echo >&2 "no users specified - see '$prog -h' for help" fi См. также
bash(1), pwgen(1); домашняя страница программы pwgen (http://sourceforge.net/proiects/pwgen/).
Сценарий mass_passwd генерирует для каждого пользователя отдельный файл с указанием новых паролей и инструкциями, которые вы сочтете нужным включить. Это позволяет легко распечатать отдельную инструкцию для каждого пользователя.