文档库 最新最全的文档下载
当前位置:文档库 › curl命令详解

curl命令详解

curl
另一个可以用来进行文件传输的工具是 curl,它是对 libcurl 库的一个命令行工具包装。 libcurl 库中提供了相应功能的 API,可以在程序中调用。
对于 libcurl 库的使用方法介绍超出了本文的讨论范围。 curl 使用 URL 的语法来传输文件,它支持 FTP, FTPS, HTTP, HTTPS, TFTP, SFTP,
TELNET 等多种协议。 curl 功能强大,它提供了包括代理支持,用户认证,FTP 上载,HTTP post,SSL 连接,文件续传等许多特性。
curl中常见错误
curl: (6) Couldn't resolve host '':说明上传或下载的网址不对
curl: (7) couldn't connect to host :很有可能是主机服务器没有开,或者连接主机的IP、Port错误
curl的断点续传
download:
Linux: curl -C - -u 'test':'test' ftp://https://www.wendangku.net/doc/b14149265.html,/test.tar.gz
Win: curl -C - -u "test":"test" ftp://https://www.wendangku.net/doc/b14149265.html,/test.rar

upload:
Linux: curl -C - -T test.tar.gz moc.src.tar -u 'test':'test' ftp://https://www.wendangku.net/doc/b14149265.html,/
Win: curl -C - -T test.rar -u "test":"test" ftp://https://www.wendangku.net/doc/b14149265.html,/

注意断点续传的参数是 -C, 要自动续传的话要使用 "-C -", 否则需要手工指定断点的字节位置.
测试通过范例:
upload:curl -C - -T /home/root/ke/file_save -u ke:900307 ftp://192.168.2.200
download:curl -C - -u ke:900307 ftp://192.168.2.200/kkk -o /home/root/ke/aaa //注意,不要掉了下载到客户端的文件名
在利用curl传输过程中,如果不限制传输速度,那它占用的带宽可能非常大,这样会影响其它利用网络的程序,所以我们可以加上以下参数:
--limit-rate 限制传输速度,单位为bytes/s
curl大概在断网后的5秒之内,如果网络又连接上的话,它会继续接着传下去;超过5秒之后,即使网络连接上了,它也无法接着传了,
也就是这个连接已经失效了。此时的方法是,将这个连接杀死,重新启动一个连接,继续传下去。
curl实例:
curl -u OMCreader:FtAcUs ftp://192.168.113.210/BSC/BAM/dbf/BSCCELL.DBF -P - -o D:/data/concurrent/2729/BSCCELL.DBF -m 600 -R -C - --retry 5 --retry-delay 120 --retry-max-time 20
1>>192.168.113.210_err.log 2>>192.168.113.210_stdout.log
rem 指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
if %errorlevel%==0 (echo BSCCELL.DBF下载成功>>192.168.113.210_stdout.log) else BSCCELL.DBF下载失败>>192.168.113.210_stdout.log
对以上curl语句解释:
OMCreader: 用户名
FtAcUs : 密码
ftp://192.168.113.210/BSC/BAM/dbf/BSCCELL.DBF :下载文件ftp路径
-P : FTP协议的数据传输存在两种模式:主动模式和被动模式 ,此处为被动模式
- -o

:输出路径
-m : 表示允许的整个操作的最长耗时,单位为秒
-R :该选项指定下载字节的范围,常应用于分块下载文件
-C : 表示断点续传功能,与-o选项配合使,如果指定offset,则从offset的位置开始续 传。如果未指定offset,或者直接用"-C -",则curl会自己分析该从什么位置开始续传。
--retry : 当传输过程中出现错误,如超时、FTP 5xx返回码或者HTTP 5xx返回码,curl会进行按照设置进行重试,这几个选项都与重试有关
--retry-delay :设置两次重试的间隔时间,
--retry-max-time 设置两次重试间隔的最长时间。默认情况下,curl不进行重试;如果重试,第一次间隔1秒,之后每次都间隔上一次的2倍时间,直到间隔时间达到10分钟,之后的重试都将采用10分钟间隔。如果这3个选项的值被重新设置,则执行设置值。
errorlevel: 判断上个命令的反回值.对下载文件成功与否下入日志文件。
if errorlevel 数值 command 语句
这个语句是用于判断上一个命令执行的返回值errorlevel,我们还是先来看看例子,
例13
@echo off
net user
if %errorlevel% == 0 (echo net user 命令执行成功) else (echo net user 命令执行失败)
Pause
注意:%errorlevel% 这是个系统变量,所以用两个%括起来,这里的==为两个连续的=
也许有些朋友说我上面的例子是不是写错了?按照语法应该写成“if errorlevel 0”才对的呀。
如果你是这样用的话,那你就错了,还真不信呀?OK,我们来设计个实验看看
(三)Libcurl中使用curl_easy_perform阻塞, 遇到无信号卡死的完美解决方案
项目背景:
近来jwisp在做OMA-DM的android终端侧,要实现的功能包括FUMO, SCOMO下载管理.由于项目是基于funambol的开源代码,在实现FUMO和SCOMO时,
使用了libcurl的库来实现下载服务测的指定文件,下载后实现android固件升级或android应用下载安装功能,
最后将FUMO/SCOMO的下载安装结果上报给服务端.
下载流程比较简单, 使用curl_easy_perform即可实现完整的下载流程,安装后,使用OMA DM协议上报给平台侧.但是jwisp这里的需求还有两个异常情况需要处理:
1. 下载过程中,遇手机突然掉电(操作:扣电池), android终端再次启动后应能恢复现场然后自动下载,下载方式为建议断点续传
2. 下载过

程中信号中断,中断时间在5分钟之内,终端应尝试重新连接,连接次数在3次以上.重新连接后建议使用断点续传方式继续下载.
libcurl使用时疑难问题
在使用libcurl时, jwisp发现, curl_easy_perform是阻塞的方式进行下载的, curl_easy_perform执行后,程序会在这里阻塞等待下载结束(成功结束或者失败结束).此时若正常下载一段时间后,进行网络中断, curl_easy_perform并不会返回失败,而是阻塞整个程序卡在这里,此时即使网络连接重新恢复, curl_easy_perform也无法恢复继续下载,导致整个程序出现”死机”状态.
但是若先断网, 然后进行curl_easy_perform的话,会直接返回失败,不会阻塞
在网上搜索后发现, 大家在网上遇到这个问题的很多,但是解决方法很少,下面jwisp就把网上建议的可以使用的解决方法罗列:
1. 使用multi模式下载,而不使用easy模式,此方法的唯一好处就是multi并不会阻塞,而是立即返回.但是缺点是带来了问题,其一就是需要自己去阻塞,当我们需要返回时再返回,其二还需要启动一个线程,需要自己控制整个过程的节奏.
2. 在下载中,另起一个线程,若发现下载状态卡死(可以通过定期检查文件大小来实现),则从外部中断下载线程.此方法需另起线程,而且直接中断线程,会给整个程序带来不稳定.
在尝试使用网上的方法失败后, jwisp终于设计出了自己的方案,并完美解决信号中断异常,下载中掉电异常,断点续传等问题.并且此方案不需要启动任何另外的线程,不需要手动进行阻塞,在信号中断后,恢复连接最快可在0.5秒内恢复下载.并且恢复下载方式全部为断点续传.
主要的设计思路如下, 下载过程中,设置超时时间为30秒, 30秒后若下载未完成就重新连接进行下载(这个可解决卡死问题),每次下载时进行判断,
若不是首次下载则获得当前已下载文件大小,从该大小处进行续传,若网络仍处于断开状态,
再次连接会立即返回失败,此时让当前线程等待0.5秒后进行连接(这个可以解决瞬间恢复连接的问题),
连接次数不超过600次(这个用来保证5分钟后返回失败).掉电需要在程序已启动时检查是否上次未下载完如果是,则直接调用下载续传方法即可.
这样基本上所有的问题的流程就都能顺利走下来,并且下载过程体验好,可随时取消.
该方案主要通过两个函数来实现, 一个负责进行断点续传和基本设置,并执行下载,一个负责控制整个下载重试次数,返回下载结果.并且需要注意的是,安装完成后,应将相应的文件删除掉.
此方案容易理解, 代码比较简单, 但是在此方案之前, jwisp试过不下10中解决方案, 最终这套方案就是由这10套方案改进出来的. 此代码可以方案移植到各位读者需要的环境中去, 只需进行小的参数

的改变即可适应
Linux使用Shell脚本实现ftp的自动上传下载
ftp 子命令
命令 描述
ls 列出远程机的当前目录
cd 在远程机上改变工作目录
lcd 在本地机上改变工作目录
ascii 设置文件传输方式为 ASCII 模式
binary 设置文件传输方式为二进制模式
close 终止当前的 ftp 会话
get (mget) 从远程机传送指定文件到本地机
put (mput) 从本地机传送指定文件到远程机
open 连接远程 ftp 站点
quit 断开与远程机的连接并退出 ftp
? 显示本地帮助信息
! 转到 Shell 中
prompt 1 关闭交互模式
使用实例:
利用编写 ftp 脚本可以自动完成文件传输任务。具体方法是使用 ftp 命令的 -in 选项,并重定向 ftp 命令的输入。现在我们来编写一个利用 ftp 登录到远程服务器,并以 bin 的文件格式,在 /home 目录下,下载 file1.log 以及 file2.sh 至本机 /opt/ibm/,并从本地 /opt 目录上传文件 file3.jave 至远程服务器 /home 的自动化脚本。
ftp -ni <<+
open $IP
user $USERNAME $PASSWD
bin /*采用二进制传输。如果你要上传下载,这一步很重要,不先执行这个命令,上传下载会很慢。*/
cd /home
lcd /opt/ibm
mget file1.log file2.sh
lcd /opt
mput file3.jave
ls
bye
# ftpput -v 192.168.1.202 -u dp -p 123456 /home/dp/1.jpg 1.jpg
wget ftp://ip/pub/app -O app //是大写o(output),不是零,这样就可以把自己电脑中的程序烧进pos机中了
1. ftp自动登录批量下载文件。
#####从ftp服务器上的/home/data 到 本地的/home/databackup####
#!/bin/bash
ftp -n<open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
mget *
close
bye
!
2. ftp自动登录上传文件。
####本地的/home/databackup to ftp服务器上的/home/data####
#!/bin/bash
ftp -n<open 192.168.1.171
user guest 123456
binary
hash
cd /home/data
lcd /home/databackup
prompt
mput *
close
bye
!
3. ftp自动登录下载单个文件。
####ftp服务器上下载/home/data/a.sh to local /home/databackup####
#!/bin/bash
ftp -n<open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
get a.sh a.sh
close
bye
!
4. ftp自动登录上传单个文件。
####把本地/home/databachup/a.sh up ftp /home/databackup 下####
#!/bin/bash
ftp -n<open 192.168.1.171
user guest 123456
binary
cd /home/data
lcd /home/databackup
prompt
put a.sh a.sh
close
bye
!
小结:把以上脚本另存为文件加入到crontab中即可实现ftp自动上传、下载文件。
注解:
1. -n 不受.netrc文件的影响。(ftp默认为读取.netrc文件中的设定)
2. << 是使用即时文件重定向输入。
3. !是即时文件的标志它必须成对出现,以标识即时文件的开始和结尾。


相关文档