# scp — передача файлов по SSH

Индекс LLMS: [llms.txt](/llms.txt)

---

scp — утилита для копирования файлов по SSH поверх протокола SSH. Работает из терминала, не требует настройки сервера сверху — достаточно работающего sshd и авторизации. В эпоху rsync и bat SCP живёт как простой инструмент для разовых передач, когда не хочется возиться с daemon-ами или конфигурацией.

## Синтаксис и базовые сценарии

Общий вид:

```bash
scp [флаги] источник назначение
```

Источник и назначение могут быть локальными путями или remote-адресами в формате `user@host:path`.

```bash
# Локальный файл на удалённую машину
scp ./deploy.tar.gz deploy@10.0.2.15:/opt/app/

# Удалённый файл на локальную машину
scp deploy@10.0.2.15:/opt/app/deploy.tar.gz ./

# Между двумя удалёнными хостами (через локальную машину)
scp user@host1:/data/backup.sql user@host2:/data/restore/
```

> [!TIP]
> Если на удалённом хосте используется нестандартный порт SSH, указывайте его через `-P` (заглавная P — у scp, в отличие от ssh).

## Копирование директорий рекурсивно

Для копирования директории нужен флаг `-r`. Без него scp откажется передавать каталог и выведет ошибку.

```bash
scp -r ./project/ dev@10.0.2.15:/home/dev/projects/
```

> [!WARNING]
> При рекурсивном копировании scp передаёт содержимое директории, а не саму директорию целиком. Поведение зависит от наличия или отсутствия завершающего `/` в пути — проверяйте результат, если структура важна.

## Полезные флаги

| Флаг | Описание |
|------|----------|
| `-r` | Рекурсивное копирование директорий |
| `-P port` | Порт SSH на удалённом хосте |
| `-p` | Сохраняет время модификации, доступ и права файла |
| `-q` | Без прогресс-бара, тихий режим |
| `-C` | Сжатие данных при передаче |
| `-i key.pem` | Указание приватного ключа |
| `-o StrictHostKeyChecking=no` | Автоматическое принятие нового хост-ключа |
| `-l rate` | Ограничение полосы пропускания в Kbit/s |

```bash
scp -r -p -C -i ~/.ssh/deploy_key.pem -P 2222 ./build/ deploy@10.0.2.15:/var/www/
```

## Типичные паттерны передачи

**Развёртывание артефактов:**

```bash
scp ./release.tar.gz deploy@prod:/tmp/releases/
```

**Забрать лог с удалённого сервера:**

```bash
scp admin@10.0.2.15:/var/log/app/error.log ./logs/
```

**Массовая передача нескольких файлов:**

```bash
scp config.yaml secrets.env deploy@10.0.2.15:/opt/app/
```

**Передача между двумя серверами напрямую** (источник и приёмник оба remote):

```bash
scp -3 user@host1:/data/file.csv user@host2:/data/import/
```

Флаг `-3` перенаправляет трафик через локальную машину. Без него scp пытается установить соединение напрямую между хостами, что обычно не работает.

## Ограничения и альтернативы

scp не поддерживает возобновление прерванных передач — если соединение оборвалось на середине гигабайтного файла, придётся начинать заново. Нет инкрементальной синхронизации, нет проверки контрольных сумм. Передача идёт последовательно, параллельная передача нескольких файлов не встроена.

Для повседневных задач rsync решает эти проблемы:

```bash
rsync -avz -e "ssh -p 2222" ./build/ deploy@10.0.2.15:/var/www/
```

rsync умеет докачивать разорванные передачи, пропускать уже скопированные файлы и работать инкрементально. Для одноразовой передачи нескольких мелких файлов scp по-прежнему удобен — меньше параметров, быстрее на входе.

> [!NOTE]
> В современных дистрибутивах scp может быть обёрнут в OpenSSH-клиент. Поведение совпадает, но если заметили отличия в выводе или обработке ошибок — это нормально, реализация зависит от версии OpenSSH.
