Вопрос или проблема
Я долгое время использовал FileZilla. Теперь, из-за необходимости в эффективности, я переключаюсь на командную строку sftp
с рабочего стола Linux на сервер Linux.
Команда sftp put
отлично работает для загрузок. Однако, в отличие от FileZilla, нет запроса на подтверждение перезаписи существующего файла на сервере. Я, конечно, боюсь случайной перезаписи. Есть ли способ сделать так, чтобы sftp
запрашивал подтверждение перед перезаписью?
Нет, команда put
в sftp
не может предоставить интерактивный запрос для подтверждения перезаписи существующего файла. Предполагается, что вы знаете, что делаете.
Если вы хотите убедиться, что загружаете файлы без перезаписи существующих файлов, используйте команду sftp
mkdir
, чтобы создать каталог на удаленном хосте, и cd
в него перед загрузкой ваших файлов в этот новый и пустой каталог.
Например,
uploaddir=$( date +upload_%F ) # т.е. что-то вроде "upload_2020-05-18"
sftp remote <<END_SFTP
cd some/remote/path
mkdir $uploaddir
cd $uploaddir
put myfile
END_SFTP
Команда mkdir
упадет, если уже есть каталог с тем же именем, который вы пытаетесь создать. Когда sftp
выполняет неинтерактивный пакетный сценарий, как выше, сценарий завершится на этом этапе.
sftp (и ftp) не имеет этой функции. Если ввести help
в командной строке sftp, он покажет put [-afpR]
, -a
используется для возобновления загрузки файла, -f
для управления кэшом, -p
для сохранения метаданных файла (временные метки и режимы доступа), -R
для выполнения нескольких подключений.
В любом случае, в sftp вы можете использовать подстановочные знаки для передачи файлов и избежать перезаписи, но это требует некоторой сложности.
Если вы можете использовать rsync
, вы можете автоматически разрешить конфликты, но rsync не предоставляет интерактивного способа, вы должны указать параметры для перезаписи или сохранения удаленных файлов, если не уверены, используйте --dry-run
, чтобы не изменять ничего, и --progress
, чтобы показать, что будет сделано.
Ответ или решение
Как предотвратить случайное перезаписывание файлов при использовании команды sftp put
Переход на использование командной строки для передачи файлов с локального Linux-устройства на сервер через SFTP может существенно повысить эффективность рабочего процесса. Однако, как вы правильно заметили, одна из проблем, с которой сталкиваются пользователи, — это отсутствие подтверждения перед перезаписью существующих файлов на сервере. В данной статье мы рассмотрим способы предотвращения случайных перезаписей файлов в SFTP и предложим некоторые альтернативы.
1. Автоматизация с использованием команд mkdir
Так как SFTP не предоставляет интерактивного подтверждения перед перезаписью, одним из простых решений является создание новой директории перед загрузкой файлов. Вы можете использовать команду mkdir
, чтобы создать новую папку с уникальным именем на сервере, основанным, например, на текущей дате. Это поможет избежать потенциальных конфликтов с уже существующими файлами.
Пример:
uploaddir=$(date +upload_%F) # Пример названия директории: "upload_2023-10-04"
sftp remote <<END_SFTP
cd some/remote/path
mkdir $uploaddir
cd $uploaddir
put myfile
END_SFTP
Если директория с тем же именем уже существует, команда mkdir
вернется с ошибкой, и ваш скрипт завершится, что предотвратит дальнейшие действия.
2. Использование rsync
Другой мощный инструмент, который вы можете рассмотреть, — это rsync
. Этот инструмент не только помогает синхронизировать файлы, но также предоставляет различные опции для обработки конфликтов. Например, если вы хотите избежать перезапись существующих файлов, вы можете использовать команду rsync
с параметром --ignore-existing
.
Пример использования rsync:
rsync -av --ignore-existing myfile remote:/path/to/destination/
Этот подход позволяет избежать проблем с перезаписью и обеспечивает обратную связь о том, какие файлы были пропущены.
3. Создание резервных копий
Рекомендуется заранее создавать резервные копии существующих файлов на сервере. Вы можете написать скрипт, который будет сохранять резервные копии файлов перед их перезаписью. Например, вы можете добавить временную метку к имени файла при его загрузке.
Пример резервного копирования:
sftp remote <<END_SFTP
cd some/remote/path
rename myfile myfile.bak.$(date +%F_%H-%M-%S)
put myfile
END_SFTP
Эта команда переименует существующий файл перед загрузкой нового, обеспечивая таким образом, что вы не потеряете старую версию.
4. Применение условий с использованием wildcards
Хотя SFTP позволяет использовать подстановочные знаки, это может вызвать сложность. Например, если вы хотите загружать только файлы, которые совпадают с определенным шаблоном, вы можете использовать подстановочные знаки (*.txt, например) для загрузки только нужных файлов. Хотя это не гарантирует защиту от перезаписи, это может снизить риск загрузки не тех файлов.
Заключение
Несмотря на то, что команда sftp put
не имеет встроенной функции подтверждения перезаписи, есть несколько способов избежать потери данных при использовании этого клиента. Автоматизация процессов через создание уникальных директорий, использование инструмента rsync
, создание резервных копий и применение условий с помощью подстановочных знаков могут значительно снизить риск случайного перезаписывания файлов на сервере.
Выбор подходящего решения должен зависеть от ваших потребностей и предпочтений в управлении файлами. Не забывайте тестировать ваши команды в безопасной среде, чтобы избежать нежелательных последствий.