Я почти не работаю с ftp протоколом из-за его ограничений и проблем с безопасностью. Тем не менее иногда приходится иметь с ним дело, потому что предоставляют доступ к каким-то ресурсам по ftp. Мне понадобилось загружать готовые бэкапы на ftp сервер. На удивление, я потратил много времени, пока не нашел простой и подходящий вариант.
Научиться настраивать 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 :)
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
А не пробовали в скрипте с ftp взять пароль в ординарные кавычки? Вот так PASSWD='password12345678'
При двойных кавычках необходимо спецсимволы экранировать обратным слэшем \ , а при ординарных этого не требуется.
Я как только не пробовал. С кавычками и без, через переменную и напрямую. Не понял, почему не получилось. Но в итоге через curl все гораздо удобнее, так что даже разбираться больше не хочется. Для одного файла curl оптимальный вариант. Вот если надо не только передавать, но и что-то с ftp брать, например список файлов, то тут уже придется с первым скриптом колхозить.
А не может быть причиной, что в скрипте вы задаёте переменную HOST, а потом используете $SERVER?
Попробовал на центе - скрипт работает.