SCP и Git: работа с файлами и репозиториями
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.
- Создайте токен:
- GitHub → `Settings` → `Developer settings` → `Personal access tokens` → `Tokens (classic)`
- Нажмите `Generate new token` → выберите срок действия
- ✅ Обязательно отметьте scope: **`repo`** (Full control of private repositories)
- Скопируйте токен (он покажется один раз!)
- Клонируйте:
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`.
- Сгенерируйте ключ (если ещё нет):
ssh-keygen -t ed25519 -C "your_email@example.com" # Нажмите Enter для всех вопросов (ключ сохранится в ~/.ssh/) - Добавьте публичный ключ в GitHub:
cat ~/.ssh/id_ed25519.pubСкопируйте вывод и добавьте в GitHub → `Settings` → `SSH and GPG keys` → `New SSH key`
- Проверьте соединение:
ssh -T git@github.com # Должно быть: Hi username! You've successfully authenticated... - Клонируйте:
git clone git@github.com/OWNER/REPO.git
Способ 3: GitHub CLI (`gh`)
Официальный инструмент GitHub. Авторизация в один шаг.
- Установите `gh`: https://cli.github.com/
- Войдите:
gh auth login # Выберите GitHub.com → HTTPS или SSH → браузер/токен - Клонируйте:
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 |
Чек-лист перед клонированием
- [ ] Вы добавлены в репозиторий с ролью `Read` или выше
- [ ] Установлен Git (
git --version) - [ ] Выбран метод авторизации (PAT / SSH /
gh) - [ ] URL репозитория скопирован правильно (кнопка `Code` → HTTPS/SSH/CLI)