Ключи команды adduser и автоматизация при создании пользователей
1. Основные ключи команды adduser
Основной синтаксис:
bash
adduser [опции] username
Полный список ключей с примерами:
bash
# 1. Базовые опции adduser --home /home/username username # Указать домашнюю директорию adduser --shell /bin/bash username # Указать shell adduser --uid 1001 username # Указать UID вручную adduser --gid 1001 username # Указать основную группу adduser --ingroup developers username # Добавить в существующую группу # 2. Системные пользователи adduser --system username # Создать системного пользователя adduser --system --home /nonexistent username adduser --system --shell /usr/sbin/nologin username # 3. Группы adduser --disabled-password username # Без пароля adduser --disabled-login username # Запретить вход adduser --gecos "Full Name,Room,Work,Home" username # GECOS информация # 4. Расширенные adduser --force-badname username # Игнорировать проверку имени adduser --quiet username # Тихий режим (без вопросов) adduser --debug username # Режим отладки
2. Разница между adduser и useradd
adduser (удобный, интерактивный):
bash
# Задает вопросы, создает домашнюю директорию, копирует файлы из /etc/skel sudo adduser username
useradd (низкоуровневый):
bash
# Только создает запись, без домашней директории по умолчанию sudo useradd username # Чтобы было как у adduser: sudo useradd -m -s /bin/bash username
3. Практические примеры для разных сценариев
Пример 1: Создание обычного пользователя
bash
sudo adduser --home /home/john --shell /bin/bash \
--ingroup users --uid 2001 \
--gecos "John Doe,Office 101,555-1234,555-4321" johndoe
Пример 2: Создание пользователя для веб-сервера
bash
sudo adduser --system --home /var/www/example.com \
--shell /bin/bash --ingroup www-data \
--disabled-password www_example
Пример 3: Создание пользователя для службы (service account)
bash
sudo adduser --system --no-create-home \
--shell /usr/sbin/nologin --disabled-login \
--group myservice
Пример 4: Автоматическое создание (для скриптов)
bash
sudo adduser --quiet --disabled-password \
--shell /bin/bash --home /home/auto_user \
--gecos "" autouser
4. Скрипты при создании пользователя
Автоматический запуск скрипта при создании пользователя:
Способ 1: Через /etc/skel/ (рекомендуется)
bash
# 1. Создаем скрипт в /etc/skel/ sudo nano /etc/skel/.custom_setup.sh
bash
#!/bin/bash # /etc/skel/.custom_setup.sh echo "Добро пожаловать, $(whoami)!" echo "Ваш домашний каталог: $HOME" echo "Дата первого входа: $(date)"
bash
# 2. Делаем исполняемым sudo chmod +x /etc/skel/.custom_setup.sh # 3. Добавляем вызов в .bashrc sudo echo -e "\n# Первоначальная настройка\nif [ -f ~/.custom_setup.sh ]; then\n . ~/.custom_setup.sh\nfi" >> /etc/skel/.bashrc
Теперь при создании пользователя:
bash
sudo adduser testuser # Скрипт автоматически скопируется в его домашнюю директорию
Способ 2: Кастомный скрипт-обертка
bash
#!/bin/bash
# /usr/local/bin/adduser_custom.sh
USERNAME=$1
# Создаем пользователя
sudo adduser --home /home/$USERNAME \
--shell /bin/bash \
--gecos "Auto created user" $USERNAME
# Копируем кастомные файлы
sudo cp -r /etc/custom_skel/* /home/$USERNAME/
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME
# Устанавливаем особые права
sudo setfacl -m u:$USERNAME:rwx /shared_directory
# Логируем создание
echo "$(date): Создан пользователь $USERNAME" >> /var/log/user_creation.log
Способ 3: Использование хуков (pam_script)
bash
# Установка sudo apt install libpam-script # Настройка в /etc/pam.d/common-session session optional pam_script.so
bash
# /etc/pam-script.d/session
#!/bin/bash
if [ "$PAM_TYPE" = "open_session" ]; then
# Первый вход пользователя
if [ ! -f /home/$PAM_USER/.first_login_done ]; then
# Выполняем скрипт
/usr/local/bin/first_login.sh $PAM_USER
touch /home/$PAM_USER/.first_login_done
fi
fi
5. Полный пример: автоматизированное создание DevOps пользователя
bash
#!/bin/bash
# create-devops-user.sh
# Полная автоматизация создания пользователя для DevOps
set -e # Прерывать при ошибках
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Проверка аргументов
if [ -z "$1" ]; then
echo -e "${RED}Использование: $0 username${NC}"
exit 1
fi
USERNAME=$1
USER_HOME="/home/$USERNAME"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
echo -e "${YELLOW}Создание пользователя $USERNAME...${NC}"
# 1. Создание пользователя с SSH доступом
sudo adduser --disabled-password --gecos "" "$USERNAME"
# 2. Установка пароля
echo "$USERNAME:$(openssl rand -base64 12)" | sudo chpasswd
# 3. Создание .ssh директории
sudo mkdir -p "$USER_HOME/.ssh"
sudo chmod 700 "$USER_HOME/.ssh"
# 4. Добавление SSH ключей (пример)
if [ -f "/tmp/${USERNAME}_keys.pub" ]; then
sudo cp "/tmp/${USERNAME}_keys.pub" "$USER_HOME/.ssh/authorized_keys"
else
# Генерируем ключ для пользователя
sudo ssh-keygen -t rsa -b 4096 -f "$USER_HOME/.ssh/id_rsa" -N "" -C "$USERNAME@$(hostname)"
sudo cp "$USER_HOME/.ssh/id_rsa.pub" "$USER_HOME/.ssh/authorized_keys"
fi
sudo chmod 600 "$USER_HOME/.ssh/authorized_keys"
sudo chown -R "$USERNAME:$USERNAME" "$USER_HOME/.ssh"
# 5. Настройка sudo прав
echo "$USERNAME ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/systemctl, /usr/bin/docker" | sudo tee /etc/sudoers.d/$USERNAME
sudo chmod 440 /etc/sudoers.d/$USERNAME
# 6. Добавление в группы
sudo usermod -aG sudo,docker,www-data,adm "$USERNAME"
# 7. Копирование кастомных конфигов
sudo cp -r /etc/skel/.bashrc /etc/skel/.profile "$USER_HOME/"
# 8. Создание кастомного .bashrc
sudo tee -a "$USER_HOME/.bashrc" > /dev/null << 'EOF'
# === DevOps Customizations ===
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
export HISTTIMEFORMAT="%d/%m/%y %T "
export EDITOR=nano
# Aliases
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
# Docker aliases
alias dps='docker ps'
alias dlogs='docker logs'
alias dimages='docker images'
alias dstop='docker stop'
alias dstart='docker start'
alias drm='docker rm'
# Kubernetes aliases
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
alias kgn='kubectl get nodes'
# Functions
function mkcd() { mkdir -p "$1" && cd "$1"; }
function cls() { clear; printf '\033[3J'; }
function ips() { hostname -I | awk '{print $1}'; }
# Welcome message
echo "=== Добро пожаловать, $USERNAME ==="
echo "Сервер: $(hostname)"
echo "IP: $(hostname -I | cut -d' ' -f1)"
echo "Дата: $(date)"
echo "================================="
EOF
# 9. Создание скрипта первого входа
sudo tee "$USER_HOME/first_login_setup.sh" > /dev/null << 'EOF'
#!/bin/bash
echo "=== Первая настройка пользователя ==="
echo "Создание необходимых директорий..."
mkdir -p ~/projects
mkdir -p ~/logs
mkdir -p ~/backups
mkdir -p ~/.aws
mkdir -p ~/.kube
echo "Настройка Git..."
git config --global user.name "$USERNAME"
git config --global user.email "$USERNAME@company.com"
git config --global core.editor nano
git config --global color.ui auto
echo "Проверка SSH ключа..."
if [ ! -f ~/.ssh/id_rsa ]; then
echo "Генерация SSH ключа..."
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "$USERNAME@$(hostname)"
fi
echo "Ваш публичный SSH ключ:"
cat ~/.ssh/id_rsa.pub
echo "=== Настройка завершена ==="
echo "Рекомендуется:"
echo "1. Скопировать SSH ключ на другие серверы"
echo "2. Настроить доступ к AWS/Kubernetes"
echo "3. Проверить доступность инструментов"
EOF
sudo chmod +x "$USER_HOME/first_login_setup.sh"
sudo chown "$USERNAME:$USERNAME" "$USER_HOME/first_login_setup.sh"
# 10. Добавление в .bash_profile для автоматического запуска при первом входе
sudo tee -a "$USER_HOME/.bash_profile" > /dev/null << 'EOF'
if [ -f ~/first_login_setup.sh ]; then
echo "Запуск первоначальной настройки..."
~/first_login_setup.sh
mv ~/first_login_setup.sh ~/first_login_setup.sh.done
fi
EOF
# 11. Создание стандартной структуры проектов
sudo mkdir -p "$USER_HOME/"{bin,scripts,tools,configs,secrets}
sudo chown -R "$USERNAME:$USERNAME" "$USER_HOME"
# 12. Копирование стандартных утилит
sudo cp /usr/local/bin/devops-* "$USER_HOME/bin/" 2>/dev/null || true
# 13. Настройка прав на общие директории
sudo setfacl -m u:$USERNAME:rwx /opt/shared
sudo setfacl -m u:$USERNAME:rx /var/log
# 14. Логирование
echo "$TIMESTAMP: Создан пользователь $USERNAME с UID $(id -u $USERNAME)" | sudo tee -a /var/log/user_management.log
echo -e "${GREEN}✓ Пользователь $USERNAME успешно создан${NC}"
echo -e "${YELLOW}Информация:${NC}"
echo "Домашняя директория: $USER_HOME"
echo "Группы: $(groups $USERNAME)"
echo "SSH ключ: $USER_HOME/.ssh/id_rsa.pub"
echo ""
echo -e "${GREEN}Для входа используйте:${NC}"
echo "ssh $USERNAME@$(hostname -I | cut -d' ' -f1)"
6. PAM-модули для автоматического выполнения при входе
Настройка pam_exec:
bash
# Редактируем PAM конфиг sudo nano /etc/pam.d/sshd
Добавить в конец:
bash
# Выполнять скрипт при успешном входе через SSH session optional pam_exec.so /usr/local/bin/on_login.sh
Создаем скрипт:
bash
#!/bin/bash
# /usr/local/bin/on_login.sh
if [ "$PAM_TYPE" = "open_session" ]; then
USER="$PAM_USER"
# Только для интерактивных сессий
if [ -n "$SSH_CONNECTION" ]; then
# Логируем вход
logger "User $USER logged in from $PAM_RHOST"
# Выполняем пользовательский скрипт если есть
if [ -f "/home/$USER/.on_login.sh" ]; then
su - "$USER" -c "/home/$USER/.on_login.sh"
fi
fi
fi
7. Systemd-сервис для пользовательских скриптов
Создаем сервис, который запускается при первом входе:
bash
# /etc/systemd/system/user-first-login@.service [Unit] Description=First login setup for %i After=network-online.target Wants=network-online.target [Service] Type=oneshot RemainAfterExit=yes User=%i Group=%i ExecStart=/usr/local/bin/first-login-script.sh %i [Install] WantedBy=multi-user.target
8. Полезные функции для .bashrc
Автоматическая загрузка при создании пользователя:
bash
# В /etc/skel/.bashrc добавляем:
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
fi
# DevOps окружение
export DEVOPS_HOME=~/devops
export PATH=$PATH:$DEVOPS_HOME/bin
# Автодополнение для kubectl
if command -v kubectl &> /dev/null; then
source <(kubectl completion bash)
fi
# Приветствие
if [ -z "$FIRST_LOGIN_SHOWN" ]; then
echo "Добро пожаловать в DevOps окружение!"
export FIRST_LOGIN_SHOWN=1
fi
9. Утилита для массового создания пользователей
bash
#!/bin/bash
# bulk-user-create.sh
USERS_FILE="users.csv" # Формат: username,fullname,groups
while IFS=, read -r username fullname groups; do
echo "Создаю $username..."
# Создание пользователя
sudo adduser --disabled-password \
--gecos "$fullname,,,," \
"$username"
# Установка временного пароля
temp_pass=$(openssl rand -base64 8)
echo "$username:$temp_pass" | sudo chpasswd
# Добавление в группы
IFS=';' read -ra GROUP_ARRAY <<< "$groups"
for group in "${GROUP_ARRAY[@]}"; do
sudo usermod -aG "$group" "$username"
done
# Запись в лог
echo "$(date): $username : $temp_pass" >> user_credentials.log
done < "$USERS_FILE"
10. Важные файлы и их назначение
| Файл | Назначение |
|---|---|
/etc/skel/ | Шаблоны для новых пользователей |
/etc/adduser.conf | Конфигурация adduser |
/etc/default/useradd | Конфигурация useradd |
/etc/login.defs | Общие настройки пользователей |
/etc/passwd | Информация о пользователях |
/etc/shadow | Пароли пользователей |
/etc/group | Группы |
11. Проверка созданного пользователя
bash
# Проверка информации id username finger username getent passwd username # Проверка домашней директории ls -la /home/username/ # Проверка групп groups username # Проверка shell getent passwd username | cut -d: -f7
12. Быстрые команды для запоминания
bash
# Создать с домашней директорией sudo adduser --home /path/to/home username # Создать без возможности входа sudo adduser --shell /usr/sbin/nologin username # Создать системного пользователя sudo adduser --system username # Создать с конкретным UID sudo adduser --uid 1500 username # Создать и сразу добавить в группы sudo adduser --ingroup sudo,docker username # Создать без пароля (для ключей) sudo adduser --disabled-password username # Показать все опции adduser --help
Ключевые моменты:
/etc/skel/— главный инструмент для кастомизации новых пользователей.bashrcи.profile— автоматически выполняются при входе- PAM модули — для системных скриптов при входе
- Права доступа — всегда проверяйте
ls -la /home/username - Логирование — ведите лог всех созданных пользователей
Используйте комбинацию /etc/skel/ для базовой настройки и кастомные скрипты для сложной логики инициализации пользователей.