#!/bin/bash set -euo pipefail # --- Константы --- DEFAULT_PORT=22 DEFAULT_USER="goodhumored" PASS_DIR="$HOME/.password-store" KEYS_DIR="$HOME/.ssh/keys" # --- Утилиты --- require() { if ! command -v "$1" &> /dev/null; then echo "Ошибка: нужна утилита '$1'" exit 1 fi } require sshpass require ssh-keygen require pass # --- Параметры --- ANONYMOUS=false PORT="$DEFAULT_PORT" NEW_USER="$DEFAULT_USER" while [[ $# -gt 0 ]]; do case "$1" in -h|--host) HOST="$2"; shift ;; -p|--port) PORT="$2"; shift ;; -r|--root_user) ROOT_USER="$2"; shift ;; -s|--server_name) SERVER_NAME="$2"; shift ;; -u|--username) NEW_USER="$2"; shift ;; -n|--pass_name) PASS_NAME="$2"; shift ;; -a|--anonymous) ANONYMOUS=true ;; *) echo "Неизвестный параметр: $1"; exit 1 ;; esac shift done [[ -z "${HOST:-}" || -z "${ROOT_USER:-}" || -z "${SERVER_NAME:-}" ]] && { echo "Ошибка: нужны --host, --root_user и --server_name" exit 1 } # --- Логика --- if $ANONYMOUS; then NEW_USER="user$(tr -dc a-z0-9 > "$CONFIG_FILE" Host $SERVER_NAME HostName $HOST Port $PORT User $NEW_USER IdentityFile $KEY_PATH EOF # --- SSH Настройка сервера --- SSH_COMMANDS=$(cat <<'EOS' set -euo pipefail sudo useradd -m -s /bin/bash -G sudo "$NEW_USER" echo "$NEW_USER:$NEW_PASS" | sudo chpasswd sudo mkdir -p "/home/$NEW_USER/.ssh" sudo chmod 700 "/home/$NEW_USER/.ssh" echo "$PUBLIC_KEY" | sudo tee "/home/$NEW_USER/.ssh/authorized_keys" > /dev/null sudo chmod 600 "/home/$NEW_USER/.ssh/authorized_keys" sudo chown -R "$NEW_USER:$NEW_USER" "/home/$NEW_USER/.ssh" sudo apt-get update sudo apt-get install -y git stow if [ "$ANONYMOUS" = "false" ]; then sudo -u "$NEW_USER" git clone https://github.com/goodhumored/dotfiles /home/"$NEW_USER"/dotfiles sudo -u "$NEW_USER" bash -c "cd /home/$NEW_USER/dotfiles && ./init.sh" fi EOS ) SSHPASS="$ROOT_PASS" sshpass -e ssh -p "$PORT" "$ROOT_USER@$HOST" \ env NEW_USER="$NEW_USER" NEW_PASS="$NEW_PASS" PUBLIC_KEY="$(cat "$KEY_PATH.pub")" ANONYMOUS="$ANONYMOUS" bash -c "$SSH_COMMANDS" echo "Готово! Новый пользователь: $NEW_USER (SSH: ssh $SERVER_NAME)"