SCP и Git: работа с файлами и репозиториями

Важно: Инструменты для копирования файлов и управления версиями в Linux-среде.

SCP: копирование файлов через SSH

Копирование содержимого папки без создания самой папки

Чтобы скопировать **только содержимое** папки, не создавая саму папку `vpn-check-02` на удалённом сервере, нужно использовать **маску `/*`** в конце пути.

scp -r "E:\dev\fvpnApp\certs\offline\vpn-check-02\*" user@remote_host:/path/to/destination/

Почему это работает:

  • `/*` указывает `scp`, что нужно взять **все файлы и подпапки внутри** `vpn-check-02`
  • Флаг `-r` рекурсивно копирует вложенные папки и их содержимое
  • В конце пути назначения **обязательно ставьте `/`**, чтобы `scp` понимал, что это директория

Важные нюансы для Windows

Проблема Решение
**Обратные слэши `\** Замените на прямые: `E:/dev/fvpnApp/.../vpn-check-02/*`
**PowerShell/CMD раскрывают `*`** Оберните путь в кавычки: `"E:\...\vpn-check-02\*"`
**Скрытые файлы** (начинаются с `.`) Не попадают под `*`. Используйте `rsync` или отдельный паттерн

Надёжная альтернатива

Этот способ избегает проблем с путями и экранированием:

cd /d E:\dev\fvpnApp\certs\offline\vpn-check-02
scp -r * user@remote_host:/path/to/destination/

*(В PowerShell достаточно `cd E:\...\vpn-check-02`)*

Полный рабочий пример

scp -r "E:/dev/fvpnApp/certs/offline/vpn-check-02/*" admin@192.168.1.50:/etc/ssl/certs/

✅ Скопирует всё содержимое `vpn-check-02` прямо в `/etc/ssl/certs/` без создания промежуточной папки.

Если нужно скопировать **только файлы определённого типа**:

scp -r "E:\dev\fvpnApp\certs\offline\vpn-check-02\*.crt" "E:\...\*.key" user@host:/dest/

Git: клонирование приватных репозиториев

Ошибка 403: разбор и решение

Ошибка `403` + сообщение `Write access to repository not granted` означает, что **аутентификация не пройдена** или **у вас нет прав на доступ** к репозиторию.

⚠️ Важно: даже для **чтения** приватного репозитория нужна авторизация. А с августа 2021 года **пароль от аккаунта не работает** для Git-операций.

Способы авторизации

Способ 1: HTTPS + Personal Access Token (PAT)

Самый простой, если вы уже работаете с HTTPS.

  1. Создайте токен:
    • GitHub → `Settings` → `Developer settings` → `Personal access tokens` → `Tokens (classic)`
    • Нажмите `Generate new token` → выберите срок действия
    • ✅ Обязательно отметьте scope: **`repo`** (Full control of private repositories)
    • Скопируйте токен (он покажется один раз!)
  2. Клонируйте:
    git clone https://github.com/OWNER/REPO.git

    При запросе `Username:` → введите ваш логин GitHub
    При запросе `Password:` → **вставьте токен** (не пароль от аккаунта)

💡 Чтобы не вводить токен каждый раз:

git config --global credential.helper store
# или для Windows/Mac используйте встроенный менеджер
git config --global credential.helper manager-core

Способ 2: SSH (рекомендуется)

Безопаснее, не требует ввода данных при каждом `pull/push`.

  1. Сгенерируйте ключ (если ещё нет):
    ssh-keygen -t ed25519 -C "your_email@example.com"
    # Нажмите Enter для всех вопросов (ключ сохранится в ~/.ssh/)
  2. Добавьте публичный ключ в GitHub:
    cat ~/.ssh/id_ed25519.pub

    Скопируйте вывод и добавьте в GitHub → `Settings` → `SSH and GPG keys` → `New SSH key`

  3. Проверьте соединение:
    ssh -T git@github.com
    # Должно быть: Hi username! You've successfully authenticated...
  4. Клонируйте:
    git clone git@github.com/OWNER/REPO.git

Способ 3: GitHub CLI (`gh`)

Официальный инструмент GitHub. Авторизация в один шаг.

  1. Установите `gh`: https://cli.github.com/
  2. Войдите:
    gh auth login
    # Выберите GitHub.com → HTTPS или SSH → браузер/токен
  3. Клонируйте:
    gh repo clone OWNER/REPO

    ✅ Автоматически настроит SSH/HTTPS и права.

Частые ошибки и решения

Ошибка Причина Решение
remote: Repository not found. Нет доступа или ошибка в URL Проверьте права и точность URL
Support for password authentication was removed Попытка войти по паролю Используйте PAT или SSH
Permission denied (publickey) Ключ не добавлен eval "$(ssh-agent -s)"ssh-add ~/.ssh/id_ed25519
fatal: could not read Username Git не знает, как авторизоваться Настройте credential.helper
Рекомендация для серверов: Используйте **SSH-ключ** — это безопасно, не требует ввода паролей и работает в фоновых задачах (cron, systemd).

Чек-лист перед клонированием

  • [ ] Вы добавлены в репозиторий с ролью `Read` или выше
  • [ ] Установлен Git (git --version)
  • [ ] Выбран метод авторизации (PAT / SSH / gh)
  • [ ] URL репозитория скопирован правильно (кнопка `Code` → HTTPS/SSH/CLI)