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

ниже приведу код скрипта
#!/bin/bash
# Проверяем, запущен ли скрипт от имени root
if [ "$EUID" -ne 0 ]; then
whiptail --title "Ошибка" --msgbox "Этот скрипт нужно запускать с правами sudo!" 8 50
exit 1
fi
# Функция для получения списка ВСЕХ групп
get_all_groups() {
awk -F: '{print $1}' /etc/group | sort
}
# Функция для получения групп пользователя
get_user_groups() {
local username=$1
groups "$username" 2>/dev/null | cut -d: -f2 | tr ' ' '\n' | grep -v "^$username$" | sort
}
# Функция для смены пароля пользователя
change_user_password() {
# Получаем список пользователей
local user_list=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " -"}' /etc/passwd | sort)
if [ -z "$user_list" ]; then
whiptail --title "Ошибка" --msgbox "Нет обычных пользователей." 8 50
return 1
fi
# Выбираем пользователя
local username=$(whiptail --title "Смена пароля" --menu "Выберите пользователя:" 20 60 10 \
$(echo "$user_list" | awk '{print $1 " " $2}') 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$username" ]; then
return 1
fi
# Проверяем существование пользователя
if ! id "$username" &>/dev/null; then
whiptail --title "Ошибка" --msgbox "Пользователь $username не существует!" 8 50
return 1
fi
# Вводим новый пароль
local password=$(whiptail --title "Смена пароля для $username" \
--passwordbox "Введите новый пароль для пользователя $username:" \
10 60 3>&1 1>&2 2>&3)
if [ $? -ne 0 ]; then
return 1
fi
if [ -z "$password" ]; then
whiptail --title "Ошибка" --msgbox "Пароль не может быть пустым!" 8 50
return 1
fi
# Подтверждаем пароль
local password2=$(whiptail --title "Смена пароля для $username" \
--passwordbox "Подтвердите новый пароль:" \
10 60 3>&1 1>&2 2>&3)
if [ $? -ne 0 ]; then
return 1
fi
if [ "$password" != "$password2" ]; then
whiptail --title "Ошибка" --msgbox "Пароли не совпадают!" 8 50
return 1
fi
# Проверяем сложность пароля (опционально)
if [ ${#password} -lt 6 ]; then
if ! whiptail --title "Предупреждение" --yesno "Пароль слишком короткий (менее 6 символов).\n\nПродолжить?" 10 60; then
return 1
fi
fi
# Меняем пароль
if echo "$username:$password" | chpasswd 2>/dev/null; then
whiptail --title "Успешно!" --msgbox "Пароль для пользователя $username успешно изменен!" 8 50
return 0
else
whiptail --title "Ошибка" --msgbox "Не удалось изменить пароль для пользователя $username!" 8 50
return 1
fi
}
# Функция для переименования пользователя
rename_user() {
# Получаем список пользователей
local user_list=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " -"}' /etc/passwd | sort)
if [ -z "$user_list" ]; then
whiptail --title "Ошибка" --msgbox "Нет обычных пользователей." 8 50
return 1
fi
# Выбираем пользователя для переименования
local old_username=$(whiptail --title "Переименование пользователя" --menu "Выберите пользователя для переименования:" 20 60 10 \
$(echo "$user_list" | awk '{print $1 " " $2}') 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$old_username" ]; then
return 1
fi
# Проверяем существование пользователя
if ! id "$old_username" &>/dev/null; then
whiptail --title "Ошибка" --msgbox "Пользователь $old_username не существует!" 8 50
return 1
fi
# Вводим новое имя
local new_username=$(whiptail --title "Переименование пользователя" \
--inputbox "Введите новое имя для пользователя $old_username:" \
10 60 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$new_username" ]; then
whiptail --title "Ошибка" --msgbox "Имя пользователя не может быть пустым!" 8 50
return 1
fi
# Проверяем, что новое имя не совпадает со старым
if [ "$old_username" = "$new_username" ]; then
whiptail --title "Информация" --msgbox "Новое имя совпадает со старым. Изменений не требуется." 8 50
return 0
fi
# Проверяем, что новый пользователь не существует
if id "$new_username" &>/dev/null; then
whiptail --title "Ошибка" --msgbox "Пользователь $new_username уже существует!" 8 50
return 1
fi
# Проверяем, что новое имя содержит только допустимые символы
if ! echo "$new_username" | grep -qE '^[a-z_][a-z0-9_-]*$'; then
whiptail --title "Ошибка" --msgbox "Недопустимое имя пользователя.\n\nИмя должно начинаться с буквы или '_' и содержать только буквы, цифры, '-' и '_'." 8 60
return 1
fi
# Подтверждаем переименование
if ! whiptail --title "Подтверждение" --yesno "Переименовать пользователя:\n\nСтарое имя: $old_username\nНовое имя: $new_username\n\nДомашняя папка будет переименована автоматически.\nПродолжить?" 14 60; then
return 1
fi
# Выполняем переименование
{
echo "0"
echo "Начинаем переименование пользователя $old_username в $new_username..."
echo "20"
echo "Блокировка пользователя..."
passwd -l "$old_username" 2>/dev/null
echo "40"
echo "Переименование пользователя..."
usermod -l "$new_username" "$old_username" 2>/dev/null
echo "60"
echo "Переименование домашней папки..."
usermod -d "/home/$new_username" -m "$new_username" 2>/dev/null
echo "80"
echo "Переименование группы пользователя..."
groupmod -n "$new_username" "$old_username" 2>/dev/null
echo "90"
echo "Разблокировка пользователя..."
passwd -u "$new_username" 2>/dev/null
echo "100"
echo "Готово!"
} | whiptail --title "Переименование" --gauge "Выполняется переименование пользователя..." 10 70 0
if [ $? -eq 0 ] || [ $? -eq 1 ]; then
whiptail --title "Успешно!" --msgbox "Пользователь $old_username успешно переименован в $new_username!" 8 50
return 0
else
whiptail --title "Ошибка" --msgbox "Не удалось переименовать пользователя!" 8 50
return 1
fi
}
# Функция для управления группами пользователя (объединенная)
manage_user_groups() {
local username=$1
# Показываем подменю для выбора действия
local action=$(whiptail --title "Управление группами для $username" --menu \
"Выберите действие:" 16 60 5 \
"1" "Добавить в группу (выбор из списка)" \
"2" "Удалить из группы (выбор из списка)" \
"3" "Показать текущие группы" \
"4" "Назад" \
3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ "$action" = "4" ]; then
return 0
fi
case $action in
1)
add_to_group "$username"
;;
2)
remove_from_group "$username"
;;
3)
show_user_groups "$username"
;;
esac
# Возвращаемся в подменю
manage_user_groups "$username"
}
# Функция для добавления в группу
add_to_group() {
local username=$1
# Получаем текущие группы пользователя
local current_groups=($(get_user_groups "$username"))
# Получаем все группы
local all_groups=($(get_all_groups))
# Фильтруем группы, в которых пользователь уже состоит
local available_groups=()
for group in "${all_groups[@]}"; do
local found=0
for cg in "${current_groups[@]}"; do
if [ "$group" = "$cg" ]; then
found=1
break
fi
done
if [ $found -eq 0 ]; then
available_groups+=("$group")
fi
done
if [ ${#available_groups[@]} -eq 0 ]; then
whiptail --title "Информация" --msgbox "Пользователь $username уже состоит во всех доступных группах." 8 50
return 1
fi
# Создаем меню
local menu_args=()
for group in "${available_groups[@]}"; do
menu_args+=("$group" "")
done
local group=$(whiptail --title "Добавление в группу" --menu \
"Выберите группу для добавления пользователя $username:" \
20 60 10 "${menu_args[@]}" 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$group" ]; then
return 1
fi
if usermod -a -G "$group" "$username" 2>/dev/null; then
whiptail --title "Успешно!" --msgbox "Пользователь $username добавлен в группу $group." 8 50
else
whiptail --title "Ошибка" --msgbox "Не удалось добавить пользователя $username в группу $group." 8 50
fi
}
# Функция для удаления из группы
remove_from_group() {
local username=$1
# Получаем текущие группы пользователя (исключая основную)
local current_groups=($(get_user_groups "$username"))
if [ ${#current_groups[@]} -eq 0 ]; then
whiptail --title "Информация" --msgbox "Пользователь $username не состоит ни в каких дополнительных группах." 8 50
return 1
fi
# Создаем меню
local menu_args=()
for group in "${current_groups[@]}"; do
menu_args+=("$group" "")
done
local group=$(whiptail --title "Удаление из группы" --menu \
"Выберите группу для удаления пользователя $username:" \
20 60 10 "${menu_args[@]}" 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$group" ]; then
return 1
fi
if gpasswd -d "$username" "$group" 2>/dev/null; then
whiptail --title "Успешно!" --msgbox "Пользователь $username удален из группы $group." 8 50
else
whiptail --title "Ошибка" --msgbox "Не удалось удалить пользователя $username из группы $group." 8 50
fi
}
# Функция для показа групп пользователя
show_user_groups() {
local username=$1
local groups=$(groups "$username" 2>/dev/null | cut -d: -f2)
if [ -z "$groups" ]; then
whiptail --title "Группы пользователя $username" --msgbox "Пользователь не состоит ни в каких группах." 8 50
else
whiptail --title "Группы пользователя $username" --msgbox "Текущие группы:\n\n$groups" 12 60
fi
}
# Функция для создания пользователя
create_user() {
username=$(whiptail --title "Создание пользователя" --inputbox "Введите имя нового пользователя:" 10 60 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$username" ]; then
whiptail --title "Ошибка" --msgbox "Имя пользователя не может быть пустым или операция отменена." 8 50
return 1
fi
if id "$username" &>/dev/null; then
whiptail --title "Ошибка" --msgbox "Пользователь $username уже существует!" 8 50
return 1
fi
password=$(whiptail --title "Создание пользователя" --passwordbox "Введите пароль для $username:" 10 60 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$password" ]; then
whiptail --title "Ошибка" --msgbox "Пароль не может быть пустым или операция отменена." 8 50
return 1
fi
password2=$(whiptail --title "Создание пользователя" --passwordbox "Подтвердите пароль для $username:" 10 60 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$password2" ]; then
whiptail --title "Ошибка" --msgbox "Подтверждение пароля отменено или пустое." 8 50
return 1
fi
if [ "$password" != "$password2" ]; then
whiptail --title "Ошибка" --msgbox "Пароли не совпадают!" 8 50
return 1
fi
# Выполняем создание
{
echo "0"
echo "Создание домашней папки..."
mkdir -p "/home/$username"
echo "25"
echo "Создание пользователя..."
useradd "$username"
echo "50"
echo "Настройка прав..."
chown -R "$username:$username" "/home/$username"
usermod "$username" -d "/home/$username"
echo "75"
echo "Установка пароля..."
echo "$username:$password" | chpasswd
echo "100"
echo "Готово!"
} | whiptail --title "Установка" --gauge "Выполняется настройка пользователя..." 10 70 0
if [ $? -eq 0 ]; then
whiptail --title "Успешно!" --msgbox "Пользователь $username создан.\nДомашняя папка настроена." 10 60
if whiptail --title "Добавление в группы" --yesno "Хотите добавить пользователя в группы сейчас?" 8 50; then
manage_user_groups "$username"
fi
else
whiptail --title "Ошибка" --msgbox "Произошла ошибка при создании пользователя." 8 50
fi
}
# Функция для удаления пользователя
delete_user() {
user_list=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " -"}' /etc/passwd | sort)
if [ -z "$user_list" ]; then
whiptail --title "Ошибка" --msgbox "Нет обычных пользователей для удаления." 8 50
return 1
fi
username=$(whiptail --title "Удаление пользователя" --menu "Выберите пользователя:" 20 60 10 \
$(echo "$user_list" | awk '{print $1 " " $2}') 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$username" ]; then
whiptail --title "Отмена" --msgbox "Операция отменена." 8 50
return 1
fi
if ! whiptail --title "Подтверждение" --yesno "Удалить пользователя $username?\n\nВНИМАНИЕ: Действие необратимо!" 10 60; then
return 1
fi
if whiptail --title "Домашняя папка" --yesno "Удалить домашнюю папку (/home/$username)?" 8 60; then
remove_home="-r"
else
remove_home=""
fi
{
echo "0"
echo "Удаление пользователя $username..."
if [ -n "$remove_home" ]; then
echo "50"
echo "Удаление домашней папки..."
userdel "$remove_home" "$username"
else
echo "50"
echo "Удаление пользователя..."
userdel "$username"
fi
echo "100"
echo "Готово!"
} | whiptail --title "Удаление" --gauge "Выполняется удаление..." 10 70 0
whiptail --title "Успешно!" --msgbox "Пользователь $username удален." 8 50
}
# Функция для показа списка пользователей
show_users() {
user_info=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " (UID:" $3 ")"}' /etc/passwd | sort)
if [ -z "$user_info" ]; then
whiptail --title "Список пользователей" --msgbox "Нет обычных пользователей." 8 50
return 1
fi
temp_file=$(mktemp)
echo "$user_info" > "$temp_file"
whiptail --title "Список пользователей" --textbox "$temp_file" 20 60
rm -f "$temp_file"
}
# Функция для показа информации о пользователе
show_user_details() {
user_list=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " -"}' /etc/passwd | sort)
if [ -z "$user_list" ]; then
whiptail --title "Ошибка" --msgbox "Нет обычных пользователей." 8 50
return 1
fi
username=$(whiptail --title "Информация о пользователе" --menu "Выберите пользователя:" 20 60 10 \
$(echo "$user_list" | awk '{print $1 " " $2}') 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$username" ]; then
return 1
fi
temp_file=$(mktemp)
cat > "$temp_file" << EOF
Информация о пользователе: $username
========================================
UID: $(id -u "$username")
GID: $(id -g "$username")
Домашняя папка: $(eval echo ~$username)
Оболочка: $(getent passwd "$username" | cut -d: -f7)
Группы: $(groups "$username" 2>/dev/null | cut -d: -f2)
Статус: $(passwd -S "$username" 2>/dev/null | awk '{print "Пароль: " $2}')
EOF
whiptail --title "Информация" --textbox "$temp_file" 20 70
rm -f "$temp_file"
}
# Функция блокировки/разблокировки
toggle_user_lock() {
user_list=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " -"}' /etc/passwd | sort)
if [ -z "$user_list" ]; then
whiptail --title "Ошибка" --msgbox "Нет обычных пользователей." 8 50
return 1
fi
username=$(whiptail --title "Блокировка/Разблокировка" --menu "Выберите пользователя:" 20 60 10 \
$(echo "$user_list" | awk '{print $1 " " $2}') 3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ -z "$username" ]; then
return 1
fi
if passwd -S "$username" 2>/dev/null | grep -q " L "; then
if whiptail --title "Разблокировка" --yesno "Пользователь $username заблокирован.\nРазблокировать?" 8 60; then
passwd -u "$username" 2>/dev/null
whiptail --title "Успешно" --msgbox "Пользователь $username разблокирован." 8 50
fi
else
if whiptail --title "Блокировка" --yesno "Пользователь $username активен.\nЗаблокировать?" 8 60; then
passwd -l "$username" 2>/dev/null
whiptail --title "Успешно" --msgbox "Пользователь $username заблокирован." 8 50
fi
fi
}
# Главное меню
while true; do
choice=$(whiptail --title "Управление пользователями" --menu \
"Выберите действие:" 26 70 14 \
"1" "Создать нового пользователя" \
"2" "Удалить пользователя" \
"3" "Показать список пользователей" \
"4" "Подробная информация о пользователе" \
"5" "Блокировка/Разблокировка пользователя" \
"6" "Смена пароля пользователя" \
"7" "Переименование пользователя" \
"8" "Управление группами пользователя" \
"9" "Выйти" \
3>&1 1>&2 2>&3)
if [ $? -ne 0 ] || [ "$choice" = "9" ]; then
whiptail --title "Выход" --msgbox " До встречи!" 8 40
exit 0
fi
case $choice in
1)
create_user
;;
2)
delete_user
;;
3)
show_users
;;
4)
show_user_details
;;
5)
toggle_user_lock
;;
6)
change_user_password
;;
7)
rename_user
;;
8)
# Сначала выбираем пользователя
user_list=$(awk -F: '$3 >= 1000 && $3 < 65534 {print $1 " -"}' /etc/passwd | sort)
if [ -z "$user_list" ]; then
whiptail --title "Ошибка" --msgbox "Нет обычных пользователей." 8 50
continue
fi
username=$(whiptail --title "Управление группами" --menu "Выберите пользователя:" 20 60 10 \
$(echo "$user_list" | awk '{print $1 " " $2}') 3>&1 1>&2 2>&3)
if [ $? -eq 0 ] && [ -n "$username" ]; then
manage_user_groups "$username"
fi
;;
*)
whiptail --title "Ошибка" --msgbox "Неверный выбор. Попробуйте снова." 8 50
;;
esac
sleep 1
done
