cURL需要永远进行FTP上传

时间:2013-03-20 12:08:17

标签: bash curl upload ftp cygwin

我在bash中编写了一个很长的部署脚本,我在cygwin下运行。如果部署到远程服务器,脚本将使用curl将生成的应用程序上载到FTP服务器,如下所示:

if [ $where == "remote" ]
then
    for i in `find deploy/ -type f`; do
        curl.exe -u "***:***" -T $i "ftp://address.co.uk/public_html/java/desktop/$i"
    done
fi

问题是有时卷曲无法完成上传,只是坐在那里阻止其他下载显示

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:15:14 --:--:--     0

这个特殊的文件是~2.5KB所以它不应该花那么长时间......我必须杀死脚本并重新开始...直到所有文件都正确上传。

我尝试添加&以在后台运行它,但我在所有上传开始的地方获得了很多curl: (28) Timeout was reached

如何修复我的脚本以无问题地上传文件?

3 个答案:

答案 0 :(得分:2)

尝试使用这些curl选项来控制它的行为。

connect-timeout <secs>设置连接尝试失败前的秒数。

--speed-time设置在curl中止传输之前允许的传输速度慢于每秒--speed_limit个字节的秒数。

--speed_limit设置限制,以字节/秒为单位,curl将中止传输。

  curl --connect_timeout <seconds> --speed-time <secs> --speed_limit <speed in bytes/sec>

-v提供了有关转移的更多信息,如果您试图找出转移速度如此之慢的原因,这可能有所帮助。

答案 1 :(得分:1)

猜测,目标服务器上的FTP连接或所有连接都是速率限制的。

由于一些文件上传的延迟是由于丢弃了SYN数据包所致。

我建议你运行一个FTP会话并使用它来递归上传或在curl的调用之间引入延迟。

理想情况下,您的目标服务器支持rsync超过ssh:这将是带宽最佳。


<强>更新
快速搜索之后,有一个名为lftp的命令行程序,它提供了ftp镜像功能。

改编自指南here,这样的事情可以解决问题:

#!/bin/bash
HOST='address.co.uk'
USER='myuser'
PASS='mypass'
TARGETFOLDER='/public_html/java/desktop/'
SOURCEFOLDER='deploy/'

lftp -f "
open $HOST
user $USER $PASS
lcd $SOURCEFOLDER
mirror --reverse --delete --verbose $SOURCEFOLDER $TARGETFOLDER
bye
"

我建议您在没有--delete的情况下执行此操作,直到您确定自己的论点正确为止!

答案 2 :(得分:1)

感谢您的帮助,我选择了wput

./wput/wput.exe -N deploy "ftp://****:****@address.co.uk/public_html/java/desktop/"