/
arch_linux
/
postinstall
Обзор
Документация
Войти
/
arch_linux
/
postinstall
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/21_user_management.sh
477 строк
16 KB
arch_linux
upload files
22 ноя 2025, 09:19
22 ноя 2025, 09:19
a4711e8
Код
Авторство
О чём код?
#!/bin/bash # Управление пользователями и группами set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" source "${SCRIPT_DIR}/user_functions.sh" # Функция для проверки существования пользователя user_exists() { local username=$1 if id "$username" &>/dev/null; then return 0 else return 1 fi } # Функция для проверки существования группы group_exists() { local groupname=$1 if getent group "$groupname" &>/dev/null; then return 0 else return 1 fi } # Функция для добавления пользователя в группу add_user_to_group() { local username=$1 local groupname=$2 if ! user_exists "$username"; then print_error "Пользователь $username не существует" return 1 fi if ! group_exists "$groupname"; then print_error "Группа $groupname не существует" return 1 fi if groups "$username" | grep -q "\b$groupname\b"; then print_success "Пользователь $username уже в группе $groupname" return 0 fi if sudo usermod -aG "$groupname" "$username"; then print_success "Пользователь $username добавлен в группу $groupname" return 0 else print_error "Ошибка добавления пользователя $username в группу $groupname" return 1 fi } # Функция для создания нового пользователя create_user() { local username=$1 local create_home=${2:-true} if user_exists "$username"; then print_warning "Пользователь $username уже существует" return 0 fi local useradd_cmd="useradd" if [ "$create_home" = "true" ]; then useradd_cmd="$useradd_cmd -m" fi if sudo $useradd_cmd -s /bin/bash "$username"; then print_success "Пользователь $username создан" # Устанавливаем пароль print_info "Установите пароль для пользователя $username:" sudo passwd "$username" return 0 else print_error "Ошибка создания пользователя $username" return 1 fi } # Функция для создания группы create_group() { local groupname=$1 if group_exists "$groupname"; then print_warning "Группа $groupname уже существует" return 0 fi if sudo groupadd "$groupname"; then print_success "Группа $groupname создана" return 0 else print_error "Ошибка создания группы $groupname" return 1 fi } # Функция для удаления пользователя delete_user() { local username=$1 local remove_home=${2:-false} if ! user_exists "$username"; then print_error "Пользователь $username не существует" return 1 fi if [ "$username" = "$SUDO_USER" ] || [ "$username" = "root" ]; then print_error "Нельзя удалить текущего пользователя или root" return 1 fi local userdel_cmd="userdel" if [ "$remove_home" = "true" ]; then userdel_cmd="$userdel_cmd -r" print_warning "Будет удалена домашняя директория пользователя $username" fi read -p "Вы уверены, что хотите удалить пользователя $username? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then if sudo $userdel_cmd "$username"; then print_success "Пользователь $username удален" return 0 else print_error "Ошибка удаления пользователя $username" return 1 fi else print_info "Удаление отменено" return 0 fi } # Функция для удаления группы delete_group() { local groupname=$1 if ! group_exists "$groupname"; then print_error "Группа $groupname не существует" return 1 fi if [ "$groupname" = "root" ] || [ "$groupname" = "wheel" ]; then print_error "Нельзя удалить системные группы: $groupname" return 1 fi read -p "Вы уверены, что хотите удалить группу $groupname? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then if sudo groupdel "$groupname"; then print_success "Группа $groupname удалена" return 0 else print_error "Ошибка удаления группы $groupname" return 1 fi else print_info "Удаление отменено" return 0 fi } # Функция для отображения информации о пользователе show_user_info() { local username=$1 if ! user_exists "$username"; then print_error "Пользователь $username не существует" return 1 fi echo "=== Информация о пользователе: $username ===" id "$username" echo "Домашняя директория: $(eval echo ~$username)" echo "Группы: $(groups "$username")" echo "Shell: $(getent passwd "$username" | cut -d: -f7)" echo "==========================================" } # Функция для отображения информации о группе show_group_info() { local groupname=$1 if ! group_exists "$groupname"; then print_error "Группа $groupname не существует" return 1 fi echo "=== Информация о группе: $groupname ===" getent group "$groupname" echo "Члены группы:" for user in $(getent group "$groupname" | cut -d: -f4 | tr ',' ' '); do echo " - $user" done echo "======================================" } # Функция для настройки стандартных групп пользователя setup_standard_groups() { local username=$1 if ! user_exists "$username"; then print_error "Пользователь $username не существует" return 1 fi print_info "Настройка стандартных групп для пользователя $username" # Стандартные группы для обычного пользователя local standard_groups=( "wheel" # sudo права "audio" # аудио устройства "video" # видео устройства "storage" # доступ к storage "optical" # оптические приводы "scanner" # сканеры "lp" # принтеры "network" # сетевое оборудование ) for group in "${standard_groups[@]}"; do if group_exists "$group"; then add_user_to_group "$username" "$group" else print_warning "Группа $group не существует, пропускаем" fi done # Специальные группы для разработки и мультимедиа local special_groups=( "docker" # Docker (если установлен) "libvirt" # Virtualization "vboxusers" # VirtualBox "kvm" # KVM "games" # Игры ) for group in "${special_groups[@]}"; do if group_exists "$group"; then add_user_to_group "$username" "$group" fi done print_success "Стандартные группы настроены для пользователя $username" } # Функция для создания пользователя разработчика create_developer_user() { local username=$1 if [ -z "$username" ]; then read -p "Введите имя пользователя: " username fi create_user "$username" "true" if [ $? -eq 0 ]; then setup_standard_groups "$username" # Создаем директории для разработки local dev_dirs=( "Developer" "Developer/python" "Developer/rust" "Developer/scripts" "Developer/projects" "Developer/docker" ) for dir in "${dev_dirs[@]}"; do sudo -u "$username" mkdir -p "/home/$username/$dir" done # Настраиваем bashrc для разработчика local bashrc_content=' # Developer aliases alias venv="source ~/venv/bin/activate" alias py="python" alias ipy="ipython" alias gitlog="git log --oneline --graph --decorate" alias dockerps="docker ps --format \"table {{.Names}}\\t{{.Image}}\\t{{.Status}}\\t{{.Ports}}\"" # Development paths export PYTHONPATH="${PYTHONPATH}:$HOME/Developer/python" export PATH="$PATH:$HOME/Developer/scripts" # Rust if [ -f "$HOME/.cargo/env" ]; then source "$HOME/.cargo/env" fi ' echo "$bashrc_content" | sudo -u "$username" tee -a "/home/$username/.bashrc" > /dev/null print_success "Пользователь разработчика $username создан и настроен" print_info "Домашняя директория: /home/$username" print_info "Директории для разработки созданы в ~/Developer/" fi } # Главное меню управления пользователями user_management_menu() { while true; do clear print_header "╔═══════════════════════════════════════════════╗" print_header "║ УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ И ГРУППАМИ ║" print_header "╚═══════════════════════════════════════════════╝" echo "" print_subheader "ОСНОВНЫЕ ОПЕРАЦИИ:" echo "1) Создать нового пользователя" echo "2) Создать пользователя разработчика" echo "3) Удалить пользователя" echo "4) Создать группу" echo "5) Удалить группу" echo "6) Добавить пользователя в группу" echo "" print_subheader "ИНФОРМАЦИЯ:" echo "7) Показать информацию о пользователе" echo "8) Показать информацию о группе" echo "9) Настроить стандартные группы для пользователя" echo "" print_subheader "СИСТЕМНЫЕ ГРУППЫ:" echo "10) Показать все группы системы" echo "11) Показать всех пользователей" echo "" echo "0) Назад в главное меню" echo "" read -p "Выберите пункт меню (0-11): " choice case $choice in 1) read -p "Введите имя нового пользователя: " username create_user "$username" "true" ;; 2) read -p "Введите имя пользователя разработчика: " username create_developer_user "$username" ;; 3) read -p "Введите имя пользователя для удаления: " username read -p "Удалить домашнюю директорию? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then delete_user "$username" "true" else delete_user "$username" "false" fi ;; 4) read -p "Введите имя новой группы: " groupname create_group "$groupname" ;; 5) read -p "Введите имя группы для удаления: " groupname delete_group "$groupname" ;; 6) read -p "Введите имя пользователя: " username read -p "Введите имя группы: " groupname add_user_to_group "$username" "$groupname" ;; 7) read -p "Введите имя пользователя: " username show_user_info "$username" ;; 8) read -p "Введите имя группы: " groupname show_group_info "$groupname" ;; 9) read -p "Введите имя пользователя: " username setup_standard_groups "$username" ;; 10) print_info "Список всех групп системы:" getent group | cut -d: -f1 | sort ;; 11) print_info "Список всех пользователей системы:" getent passwd | cut -d: -f1 | sort ;; 0) print_info "Возврат в главное меню..." break ;; *) print_error "Неверный выбор. Попробуйте снова." ;; esac echo "" read -p "Нажмите Enter для продолжения..." -n 1 done } # Автоматическая настройка пользователя после установки системы setup_post_install_users() { print_header "ПОСТ-УСТАНОВОЧНАЯ НАСТРОЙКА ПОЛЬЗОВАТЕЛЕЙ" if [ -z "$SUDO_USER" ]; then detect_user fi print_info "Настройка пользователя: $SUDO_USER" # Настраиваем стандартные группы для текущего пользователя setup_standard_groups "$SUDO_USER" # Создаем директории разработки local dev_dirs=( "Developer" "Developer/python" "Developer/rust" "Developer/scripts" "Developer/projects" "Developer/docker" "Developer/audio" "Developer/arduino" ) for dir in "${dev_dirs[@]}"; do sudo -u "$SUDO_USER" mkdir -p "/home/$SUDO_USER/$dir" done print_success "Директории разработки созданы" # Добавляем полезные алиасы в .bashrc if ! grep -q "Developer aliases" "/home/$SUDO_USER/.bashrc"; then cat >> "/home/$SUDO_USER/.bashrc" << 'EOF' # Developer aliases (added by Arch Installer) alias venv="source ~/venv/bin/activate" alias py="python" alias ipy="ipython" alias gitlog="git log --oneline --graph --decorate" alias dockerps="docker ps --format \"table {{.Names}}\\t{{.Image}}\\t{{.Status}}\\t{{.Ports}}\"" alias ll="ls -la" alias update="sudo pacman -Syu" # Development paths export PYTHONPATH="${PYTHONPATH}:$HOME/Developer/python" export PATH="$PATH:$HOME/Developer/scripts" # Rust if [ -f "$HOME/.cargo/env" ]; then source "$HOME/.cargo/env" fi # PipeWire latency (if using PipeWire) export PIPEWIRE_LATENCY="128/48000" EOF print_success "Полезные алиасы добавлены в .bashrc" fi print_success "Пост-установочная настройка пользователя завершена" } main() { if [ "$1" = "auto" ]; then setup_post_install_users else user_management_menu fi save_state } main "$@"