#!/bin/sh # Парсинг аргументов командной строки while [ $# -gt 0 ]; do case $1 in --ssh-host) SSH_HOST="$2"; shift 2 ;; --ssh-port) SSH_PORT="$2"; shift 2 ;; --ssh-user) SSH_USER="$2"; shift 2 ;; --deploy-path) DEPLOY_PATH="$2"; shift 2 ;; --private-key) USER_PRIVATE_KEY="$2"; shift 2 ;; *) echo "❌ Ошибка: Неизвестный параметр: $1"; exit 1 ;; esac done # Функция для проверки наличия аргумента check_arg() { arg_name="$1" arg_value="$2" if [ -z "$arg_value" ]; then echo "❌ Ошибка: Не указан обязательный параметр --$arg_name" exit 1 fi } # Проверка каждого аргумента отдельно check_arg "ssh-host" "$SSH_HOST" check_arg "ssh-user" "$SSH_USER" check_arg "deploy-path" "$DEPLOY_PATH" check_arg "private-key" "$USER_PRIVATE_KEY" # Проверка формата SSH-порта (если указан) if [ -n "$SSH_PORT" ]; then if ! echo "$SSH_PORT" | grep -Eq '^[0-9]+$' || [ "$SSH_PORT" -lt 1 ] || [ "$SSH_PORT" -gt 65535 ]; then echo "❌ Ошибка: Порт должен быть числом от 1 до 65535" exit 1 fi else SSH_PORT=22 # Значение по умолчанию fi # Проверка формата приватного ключа if ! echo "$USER_PRIVATE_KEY" | grep -q "PRIVATE KEY"; then echo "❌ Ошибка: Указанный приватный ключ не содержит 'PRIVATE KEY' (возможно, некорректный формат)" exit 1 fi # Создаем папку .ssh, если её нет mkdir -p ~/.ssh chmod 700 ~/.ssh # Сохраняем приватный ключ echo "$USER_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # Добавляем хост в known_hosts echo "🔑 Добавляем $SSH_HOST в known_hosts..." ssh-keyscan -p "$SSH_PORT" -H "$SSH_HOST" > ~/.ssh/known_hosts 2>/dev/null || { echo "❌ Ошибка: Не удалось добавить хост $SSH_HOST в known_hosts" exit 1 } # Запускаем ssh-agent и добавляем ключ echo "🔐 Запускаем ssh-agent..." eval "$(ssh-agent -s)" >/dev/null ssh-add ~/.ssh/id_rsa 2>/dev/null || { echo "❌ Ошибка: Не удалось добавить SSH-ключ в агент (проверьте ключ и пароль)" exit 1 } # Деплой через rsync echo "🚀 Начинаем деплой в $SSH_USER@$SSH_HOST:$DEPLOY_PATH..." rsync -avz --progress -e "ssh -p $SSH_PORT -i ~/.ssh/id_rsa" public/ "$SSH_USER@$SSH_HOST:$DEPLOY_PATH" || { echo "❌ Ошибка: Деплой не удался (проверьте путь, права или подключение)" exit 1 } echo "✅ Деплой успешно завершен!"