Какая команда копирует файлы между локальной машиной и сервером
Что проверяют
Умеете ли вы сами залить код или забрать логи с сервера, не полагаясь на готовый пайплайн. Для Python-разработчика следом часто спрашивают, как сделать то же из скрипта и чем rsync лучше при повторных заливках.
Как отвечать
Базовые инструменты работают поверх SSH и берут те же ключи и ~/.ssh/config:
scp: разовое копирование.scp app.tar.gz user@host:/opt/app/, для каталога-r, для нестандартного порта-P(заглавная, в отличие отssh -p). Начиная с OpenSSH 9.0scpпо умолчанию ходит по протоколу SFTP, старый протокол включается флагом-O;rsync: синхронизация.rsync -avz --delete ./src/ user@host:/opt/app/src/передаёт только изменившиеся части файлов, умеет--exclude, пробный прогон--dry-runи докачку через--partial. Слэш в конце источника значит «содержимое каталога», без него на сервере появится вложенныйsrc/src;sftp: интерактивная сессия, удобна, когда нужно посмотреть, что лежит на сервере.
При заливке проекта напомните про исключения: .venv, __pycache__, .git и .env с секретами на сервер ехать не должны. Это решает --exclude-from со списком в отдельном файле.
Из Python то же делают через paramiko (у него есть SFTPClient) или Fabric, где Connection.put() и get() оборачивают SFTP. Вызвать subprocess.run(["rsync", ...]) тоже нормально, если передавать аргументы списком, а не строкой с shell=True.
И уточните, что в зрелом процессе файлы на прод руками не копируют: код едет Docker-образом или пакетом через CI, а scp остаётся для разовых задач.
Где спотыкаются
Путают слэш в конце пути у rsync. Без слэша появляется лишний вложенный каталог, а если по ошибке указать целью родительский каталог вместе с --delete, rsync сотрёт там всё, чего нет в источнике. Первый прогон стоит делать с --dry-run.
Пишут scp -p 2222: маленькая -p сохраняет время изменения файлов, а порт задаёт -P.
Предлагают ftp или пароль в командной строке через sshpass. Пароль оседает в истории шелла и в списке процессов, правильный путь это ключи.