2013-08-07 4 views
0

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

echo "Moving to external server" 
    cd /root/backup/ 
/usr/bin/ftp -n -i $FTP_SERVER <<END_SCRIPT 
    user $FTP_USERNAME $FTP_PASSWORD 
    mput $FILE 
    bye 
END_SCRIPT 

после неудачной попытки входа в систему я получаю сообщение ниже

Authentication failed. Blocked. 
Login failed. 
Incorrect sequence of commands: PASS required after USER 

мне нужно, чтобы захватить такой вывод и сделать код atempt спать в течение нескольких минут, прежде чем повторить попытку.

идеи?

ответ

1

Если это возможно для вас, чтобы установить дополнительные программы на рассматриваемую систему я призываю вас чтобы посмотреть на lftp.

С помощью lftp можно установить параметры как время между повторными соединениями и т. Д. Вручную.

Для достижения своей цели с lftp вы должны вызвать следующую

lftp -u user,password ${FTP_SERVER} <<END 
set ftp:retry-530 "Authentication failed" 
set net:reconnect-interval-base 60 
set net:reconnect-interval-multiplier 10 
set net:max-retries 10 
<some more custom commands> 
END 

Если образец после ftp:retry-530 соответствует 530 ответа сервера lftp пытается восстановить соединение каждые 60 * 10 секунд.

+0

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

+0

как про повторить на 503 ошибка «заблокирована». – fawzib

1

сообщение ниже, вероятно, будет стандартным вывод вместо стандартного вывода так что вам нужно будет захватить выход Stderr первым:

while true 
do 
    if (script 2>&1 |grep -q 'Authentication failed') 
    then 
    echo "authentication failed, sleeping for a while before trying again" 
    sleep 60 
    else 
    #everything worked, break out of the while loop 
    break 
    fi 
done 
+0

Помните, когда я вхожу в команду FTP, это станет интерактивным вводом, поэтому я использую END_SCRIPT. Как я могу делать логику, как ваш код выше между ними? – fawzib

+0

if (lftp ....... << END ..... .... ... END 2> & 1 | grep -q 'Authentication failed') – dtorgo