Скрипт для работы с пользователями в Linux

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

ниже приведу код скрипта

#!/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
Micro
Author: Micro

///

Поделиться в социальных сетях
0 0 голоса
Рейтинг статьи
0 комментариев
Старые
Новые Популярные