0

我运行了一个自动备份 shell 脚本,效果很好,但由于某种原因,FTP 阻止了我几分钟。我想添加一个重试和等待功能。下面是我的代码示例。

   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

我需要捕获这样的输出并使代码尝试休眠几分钟,然后再试一次。

想法?

4

2 回答 2

1

下面的消息可能会发送到 stderr 而不是 stdout,因此您需要先捕获 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
于 2013-08-07T16:13:45.767 回答
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 秒尝试重新连接。

于 2013-08-07T16:46:18.467 回答