Загрузка файла по ftp через консоль в одну команду

Я почти не работаю с ftp протоколом из-за его ограничений и проблем с безопасностью. Тем не менее иногда приходится иметь с ним дело, потому что предоставляют доступ к каким-то ресурсам по ftp. Мне понадобилось загружать готовые бэкапы на ftp сервер. На удивление, я потратил много времени, пока не нашел простой и подходящий вариант.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Задача очень простая. Более того, у меня в своих шпаргалках даже были готовые варианты скриптов для загрузки файлов на удаленный ftp сервер. Но почему-то в этот раз они не работали. В общем случае все делается примерно так с помощью скрипта:

#!/bin/sh

USER="backup"
PASSWD="password12345678"
HOST="ftp.server.com"
FILE="/mnt/backup/zabbix_backup.tar.gz"
DIR="/backup/zabbix"

ftp -n -i -p $SERVER << EOF
user $USER $PASSWD
binary
cd $DIR
put $FILE
quit
EOF

В принципе, все просто и раньше у меня нормально загружались файлы на ftp с этим скриптом. В этот раз почему-то нет. Не проходила авторизация, хотя если я делал все руками в консоли, то работало нормально. Я подозреваю, проблема была в лютых спецсимволах в пароле, которые я не смог нормально экранировать.

В итоге пошел другим путем. Оказывается, загружать файлы на ftp с авторизацией можно с помощью curl. Вот рабочий вариант, на котором я остановился:

/usr/bin/curl --upload-file "/mnt/backup/mysql_zabbix.sql.gz" ftp://backup:'password12345678'@ftp.server.com/backup/zabbix/

Тут весь нужный функционал, который на удивление сразу заработал как надо.

backup имя пользователя ftp
password12345678 пароль от ftp, который я поместил в одиночные кавычки, чтобы экранировать спецсимволы
/backup/zabbix директория на удаленном ftp сервере
ftp.server.com адрес ftp сервера

Если загрузка не работает, можно добавить ключ -v к команде curl, будет подробный лог.

Все это было затеяно для бэкапа сервера мониторинга zabbix. Покажу сразу и сам скрипт бэкапа.

#!/bin/sh

date_time=`date +"%Y-%m-%d_%H-%M"`
bk_dir='/mnt/backup'

db_user='zabbix'
db_password='passwd87654321'
ftp_user='backup'
ftp_password='passwd12345678'
ftp_host='ftp.server.com'
ftp_dir='backup/zabbix/'

/usr/bin/mysqldump --opt -v --databases zabbix -u$db_user -p$db_password | /usr/bin/gzip -c > $bk_dir/mysql_zabbix_$date_time.sql.gz
/usr/bin/tar -czvf $bk_dir/zabbix_etc_$date_time.tar.gz /etc/zabbix /usr/lib/zabbix/alertscripts
/usr/bin/tar -czvf $bk_dir/zabbix_web_$date_time.tar.gz /usr/share/zabbix

/usr/bin/find $bk_dir -type f -mtime +3 -exec rm {} \;

/usr/bin/curl --upload-file "$bk_dir/mysql_zabbix_$date_time.sql.gz" ftp://$ftp_user:$ftp_password@$ftp_host/$ftp_dir
/usr/bin/curl --upload-file "$bk_dir/zabbix_etc_$date_time.tar.gz" ftp://$ftp_user:$ftp_password@$ftp_host/$ftp_dir
/usr/bin/curl --upload-file "$bk_dir/zabbix_web_$date_time.tar.gz" ftp://$ftp_user:$ftp_password@$ftp_host/$ftp_dir

На этом все, надежных вам бэкапов, но не по ftp :)

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

3 комментария

  1. А не пробовали в скрипте с ftp взять пароль в ординарные кавычки? Вот так PASSWD='password12345678'
    При двойных кавычках необходимо спецсимволы экранировать обратным слэшем \ , а при ординарных этого не требуется.

    • Я как только не пробовал. С кавычками и без, через переменную и напрямую. Не понял, почему не получилось. Но в итоге через curl все гораздо удобнее, так что даже разбираться больше не хочется. Для одного файла curl оптимальный вариант. Вот если надо не только передавать, но и что-то с ftp брать, например список файлов, то тут уже придется с первым скриптом колхозить.

      • Кирилл

        А не может быть причиной, что в скрипте вы задаёте переменную HOST, а потом используете $SERVER?
        Попробовал на центе - скрипт работает.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar