使用Shell脚本自动化FTP

时间:2014-01-17 09:57:57

标签: shell ftp

我使用shell脚本通过FTP传输文件,我的shell工作正常。 但问题是我的shell脚本挂起,如果FTP连接在传输之间掉落,则不会退出。

这就是我的shell脚本的样子。

echo "open $ip" > ${cmd_File}
echo "user $usrnm $psswd" >> ${cmd_File}
echo "cd $location" >> ${cmd_File}
echo "binary" >> ${cmd_File}
echo "put $filename" >> ${cmd_File}
echo "bye" >> ${cmd_File}

progress=$(ftp -vin < ${cmd_File} 2>&1) 1> /dev/null

如果有人能帮助我处理错误,我会很高兴,我的代码工作得很好,除非连接介于两者之间。 这段代码只挂起,我需要在发生这样的事情时退出代码。

谢谢, 作者Abhijit

3 个答案:

答案 0 :(得分:1)

我使用lftp代替ftp解决了问题。

在我的情况下,我试图在GoDaddy在线存储FTP上传文件。出于某种原因,最大文件(500 MB)的传输永远悬空。

照常安装(存在于主发行版中): yum install lftp(CentOS) zypper install lftp(openSuse) ...

然后创建你的脚本:

#!/bin/sh
echo FTP begin at : $(date)
lftp -u myUser,myPassword myFTPSite <<EOF
put myfile.gz
bye
EOF
echo $(date) : FTP ended

echo Validating RAID
cat /proc/mdstat
exit 0

答案 1 :(得分:0)

在ftp命令中使用-q quittime选项:

根据mn ftp:

 -q quittime
             Quit if the connection has stalled for quittime seconds.

尝试此命令,例如:

progress=$(ftp -q 30 -vin < ${cmd_File} 2>&1) 1> /dev/null

答案 2 :(得分:0)

考虑使用“expect”重写脚本,您可以在其中设置超时。一个例子是here。另一个例子是here

<强> EDITED

或者,您可以在Perl中轻松地进行错误检查,例如this

好的,你可以在shell中使用以下内容:

YOURTFPCMD & PID=$! ; (sleep $TIMEOUT && kill $PID 2> /dev/null & ) ; wait $PID

启动FTP命令并保存其PID。它们会立即启动一个子shell,如果没有完成,它会在$ TIMEOUT秒后终止你的FTP命令,然后等待你的FTP命令退出。