英文网站设计方案,深圳市门户网站建设品牌,好看的网页源码,信宜做网站前言前段时间群里讨论#xff0c;想实现某个文件定时上传到服务器要怎么来实现。我记得之前做过 一个项目#xff1a;为高通的iot模组编写FOTA功能#xff1a;实现模组可以远程下载升级镜像包#xff0c;实现版本升级功能。并当时使用的一个超级强大的工具cURL。心血来潮想实现某个文件定时上传到服务器要怎么来实现。我记得之前做过 一个项目为高通的iot模组编写FOTA功能实现模组可以远程下载升级镜像包实现版本升级功能。并当时使用的一个超级强大的工具cURL。心血来潮决定专门写一篇文章送给需要的朋友。文章分两部分首先介绍cURL的用法实现一个定时上传日志文件的一个简单的程序。 概念cURL 是常用的命令行工具用来请求 Web 服务器。它的名字就是客户端client的 URL 工具的意思。cURL 的原作者是 Daniel Stenberg 目前是 cURL 的核心开发者同时也是 IETF HTTPbis 工作组的资深成员。Daniel 在 1998 年创建了 curl 项目他编写了最初的 curl 版本并创建了 libcurl 库。到目前为止代码仓库包括的 24000 次 commit 有超过一半是 Daniel 本人提交的他依然是项目的核心开发者。Daniel 表示已将 curl 视为自己的孩子。作为一款强力工具支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP)还支持POST、cookies、认证、从指定偏移处下载部分文件等功能具有用户代理字符串、限速、文件大小、进度条、cookie支持、用户认证、断点续传等特征。一、命令的安装sudo apt-get install curl
二、cURL命令语法curl [options] [URL...]
三、URL格式URL的格式定义要参考 RFC 1808 。地址http://www.w3.org/Addressing/rfc1808.txt
《Relative Uniform Resource Locators 》
URL由三部分组成资源类型、存放资源的主机域名、资源文件名。 也可认为由4部分组成协议、主机、端口、路径 URL的一般语法格式为protocol :// hostname[:port] / path / [;parameters][?query]#fragment
(带方括号[]的为可选项)。protocol协议指定使用的传输协议下表列出 protocol 属性的有效方案名称。 最常用的是HTTP协议它也是WWW中应用最广的协议。file 资源是本地计算机上的文件。格式file:///注意后边应是三个斜杠。ftp 通过 FTP访问资源。格式 FTP://gopher 通过 Gopher 协议访问该资源。http 通过 HTTP 访问该资源。 格式 HTTP://https 通过安全的 HTTPS 访问该资源。 格式 HTTPS://mailto 资源为电子邮件地址通过 SMTP 访问。 格式 mailto:MMS 通过 支持MMS流媒体协议的播放该资源。代表软件Windows Media Player格式 MMS://ed2k 通过 支持ed2k专用下载链接协议的P2P软件访问该资源。代表软件电驴 格式 ed2k://Flashget 通过 支持Flashget:专用下载链接协议的P2P软件访问该资源。代表软件快车 格式 Flashget://thunder 通过 支持thunder专用下载链接协议的P2P软件访问该资源。代表软件迅雷 格式 thunder://news 通过 NNTP 访问该资源。hostname主机名是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时在主机名前也可以包含连接到服务器所需的用户名和密码格式username:passwordhostname。port端口号整数可选省略时使用方案的默认端口各种传输协议都有默认的端口号如http的默认端口为80。如果输入时省略则使用默认端口号。有时候出于安全或其他考虑可以在服务器上对端口进行重定义即采用非标准端口号此时URL中就不能省略端口号这一项。path路径由零或多个“/”符号隔开的字符串一般用来表示主机上的一个目录或文件地址。parameters参数这是用于指定特殊参数的可选项。query(查询)可选用于给动态网页如使用CGI、ISAPI、PHP/JSP/ASP/http://ASP.NET等技术制作的网页传递参数可有多个参数用“”符号隔开每个参数的名和值用“”符号隔开。fragment信息片断字符串用于指定网络资源中的片断。例如一个网页中有多个名词解释可使用fragment直接定位到某一名词解释。四、curl命令参数详解由于linux curl功能十分强大所以命令参数十分多下表只筛选出来部分常用的参数更多参数请运行“man curl”命令查看。ble data-draft-nodeblock data-draft-typetable data-sizenormal data-row-stylenormal五、Linux curl命令退出码下面是linux curl命令的错误代码和她们的相应的错误消息命令执行错误的时候可以通过错误码来查看出错原因方便开发调试。ble data-draft-nodeblock data-draft-typetable data-sizenormal data-row-stylenormal六、用法演示为节省篇幅部分操作不再贴上执行结果。1、查看网页源码直接在curl命令后加上网址就可以看到网页源码。我们以网址http://www.sina.com为例选择该网址主要因为它的网页代码较短rootubuntu:/home/peng# curl www.sohu.com
html
headtitle307 Temporary Redirect/title/head
body bgcolorwhite
centerh1307 Temporary Redirect/h1/center
hrcenternginx/center
/body
/html
执行结果显示 307 Temporary Redirect说明该网址需要重定向。如果要把这个网页保存下来可以使用-o参数这就相当于使用wget命令了。curl -o [文件名] www.sohu.com
2、自动跳转有的网址是自动跳转的。使用-L参数curl就会跳转到新的网址。curl -L www.sohu.com
键入上面的命令结果就自动跳转为http://www.sohu.com.cn。3、显示头信息-i参数可以显示http response的头信息连同网页代码一起。rootubuntu:/home/peng/driver/test# curl -i www.sohu.com
HTTP/1.1 307 Temporary Redirect
Content-Type: text/html
Content-Length: 180
Connection: keep-alive
Server: nginx
Date: Tue, 25 Aug 2020 10:10:54 GMT
Location: https://www.sohu.com/
FSS-Cache: from 9790436.18244590.10468709
FSS-Proxy: Powered by 2384755.3433341.3062915html
headtitle307 Temporary Redirect/title/head
body bgcolorwhite
centerh1307 Temporary Redirect/h1/center
hrcenternginx/center
/body
/html-I参数则是只显示http response的头信息。4、显示通信过程-v参数可以显示一次http通信的整个过程包括端口连接和http request头信息。rootubuntu:/home/peng/driver/test# curl -v www.sohu.com
* About to connect() to www.sohu.com port 80 (#0)
* Trying 240e:83:201:3700::5... connectedGET / HTTP/1.1User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3Host: www.sohu.comAccept: */*HTTP/1.1 307 Temporary RedirectContent-Type: text/htmlContent-Length: 180Connection: keep-aliveServer: nginxDate: Tue, 25 Aug 2020 10:11:49 GMTLocation: https://www.sohu.com/FSS-Cache: from 9855973.18375663.10534247FSS-Proxy: Powered by 2450292.3564414.3128453html
headtitle307 Temporary Redirect/title/head
body bgcolorwhite
centerh1307 Temporary Redirect/h1/center
hrcenternginx/center
/body
/html
* Connection #0 to host www.sohu.com left intact
* Closing connection #0如果你觉得上面的信息还不够那么下面的命令可以查看更详细的通信过程。curl --trace output.txt www.sohu.com
或者curl --trace-ascii output.txt www.sohu.com
运行后请打开output.txt文件查看。5、发送表单信息发送表单信息有GET和POST两种方法。GET方法相对简单只要把数据附在网址后面就行。curl example.com/form.cgi?dataxxx
POST方法必须把数据和网址分开curl就要用到--data参数。curl -X POST --data dataxxx example.com/form.cgi
如果你的数据没有经过表单编码还可以让curl为你编码参数是--data-urlencode。curl -X POST--data-urlencode dateApril 1 example.com/form.cgi
6、HTTP动词curl默认的HTTP动词是GET使用-X参数可以支持其他动词。curl -X POST www.example.com
curl -X DELETE www.example.com
7、文件上传假定文件上传的表单是下面这样form methodPOST enctypemultipart/form-data actionupload.cgiinput typefile nameuploadinput typesubmit namepress valueOK
/form
你可以用curl这样上传文件curl --form uploadlocalfilename --form pressOK [URL]
8、Referer字段有时你需要在http request头信息中提供一个referer字段表示你是从哪里跳转过来的。curl --referer http://www.example.com http://www.example.com
9、User Agent字段这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段针对不同设备返回不同格式的网页比如手机版和桌面版。iPhone4的User Agent是Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
curl可以这样模拟curl --user-agent [User Agent] [URL]
10、cookie使用--cookie参数可以让curl发送cookie。curl --cookie namexxx www.example.com
至于具体的cookie的值可以从http response头信息的Set-Cookie字段中得到。-c cookie-file可以保存服务器返回的cookie到文件-b cookie-file可以使用这个文件作为cookie信息进行后续的请求。curl -c cookies http://example.com
curl -b cookies http://example.com
11、增加头信息有时需要在http request之中自行增加一个头信息。--header参数就可以起到这个作用。$ curl --header Content-Type:application/json http://example.com
12、认证使用curl选项 -u 可以完成HTTP或者FTP的认证可以指定密码也可以不指定密码在后续操作中输入密码curl -u user:pwd http://man.linuxde.net
curl -u user http://man.linuxde.net13、FTP1)、列出ftp服务器上的目录列表curl ftp://www.xxx.com/ --user name:passwd
curl ftp://www.xxx.com/ –u name:passwd #简洁写法
curl ftp://name:passwdwww.xxx.com #简洁写法2
例如在IP地址192.168.43.117上搭建FTP服务器并设置用户名为user密码为123456 现在我们要显示服务器上根目录下的所有文件信息命令如下curl -u user:123456 ftp://192.168.43.117
执行结果如下 简洁写法curl ftp://user:123456192.168.43.117
执行结果如下 2)、只列出目录不显示进度条curl ftp://www.xxx.com –u name:passwd -s
3)、下载一个文件格式curl ftp://www.xxx.com/size.zip –u name:passwd -o size.zip
示例如下 从服务器的根目录下下载文件test.c保存到本地本地文件名也为test.c。 【注意】如果没有-o选项程序会吧数据流定向到stdout即直接把文件内容显示到终端上。curl ftp://user:123456192.168.43.117/test.c -o test.c
执行结果如下 简洁模式curl -u user:123456 ftp://192.168.43.117/list.h -o list.h
执行结果如下 4)、上载一个文件curl –u name:passwd -T size.mp3 ftp://www.xxx.com/mp3/
举例如下curl -u user:123456 ftp://192.168.43.117/ -T list.h可以看到文件并没有上传成功返回错误码是25参考第五章25 FTP couldnt STOR file. The server denied the STOR operation, used for FTP uploading.
可知是因为服务器没有赋予存储的权限所以设置服务器的write权限即可。5)、从服务器上删除文件使用curl传递ftp协议的DELE命令:curl –u name:passwd ftp://www.xxx.com/ -X DELE mp3/size.mp3
6)、另外curl不支持递归下载不过可以用数组方式下载文件比如我们要下载1-10.gif连续命名的文件**curl –u name:passwd ftp://www.xxx.com/img/[1-10].gif –O #O字母大写
7)、要连续下载多个文件curl –u name:passwd ftp://www.xxx.com/img/[one,two,three].jpg –O #O字母大写
六、实现日志文件定时上传功能程序运行时要记录当前日志文件的最后修改时间每个10秒钟就检查下log文件是否被修改如果没有被修改就休眠10秒钟如果log文件被修改了就将当前的日志文件拷贝成备份文件备份文件名字加上当前时间通过curl发送给ftp服务器删除备份文件重复步骤2。程序流程图如下函数功能介绍init()首先记录当前log文件时间并记录到全局变量last_mtime中。check_file_change()读取文件最后修改时间并和last_mtime进行比较如果相同就返回0不同就返回1.file_name_add_time()将当前的日志文件拷贝成备份文件备份文件名字加上当前时间。stat()得到对应文件的属性信息存放到struct stat结构体变量中。system()执行参数中字符串对应的命令代码如下/* Copyright (C) 公众号: yikoulinux */
#include sys/stat.h
#include stdio.h
#include stdlib.h
#include unistd.h
#include time.htypedef struct stat ST;
unsigned long last_mtime;/*用户名密码暂时写死实际应该保存在配置文件*/
char name[32]user;
char pass[32] 123456;
char ip[32] 192.168.43.117;
char filename[32]t.log;
char dstfile[256] {0};int init(void)
{//准备结构体ST status;//调用stat函数int res stat(filename,status);if(-1 res){perror(error:open file failn);return 0;}last_mtime status.st_mtime;printf(init time:%s n,ctime(last_mtime));return 1;
}int check_file_change(void)
{//准备结构体ST status;//调用stat函数int res stat(filename,status);if(-1 res){perror(error:open file failn);return 0;}
// printf(old:%s new:%s,ctime(last_mtime),ctime(status.st_mtime));if(last_mtime status.st_mtime){printf(file not changen);return 0;}else{printf(file updatedn); last_mtime status.st_mtime;return 1;}}
void file_name_add_time(void)
{ST status;time_t t; struct tm *tblock; char cmd[1024]{0};t time(NULL);tblock localtime(t);sprintf(dstfile,t-%d-%d-%d-%d-%d-%d.log,tblock-tm_year1900,tblock-tm_mon,tblock-tm_mday,tblock-tm_hour,tblock-tm_min,tblock-tm_sec);sprintf(cmd,cp %s %s,filename,dstfile);
// printf(cdm%sn,cmd);system(cmd);
}
int main(void)
{char cmd[1024]{0};init();while(1){ if(check_file_change() 1){file_name_add_time();sprintf(cmd,curl -u %s:%s ftp://%s/ -T %s,name,pass,ip,dstfile);// printf(cdm%sn,cmd);system(cmd);unlink(dstfile);}sleep(10); }
}
运行截图第一步 因为log文件没有被修改过所以程序不会上传。第二步 手动输入字符串 yikoulinux 到日志文件 t.log中。 第三步 因为文件发生了改变所以打印“file updated”同时可以看到curl上传文件的log信息。 以下是FTP服务器的根目录可以看到上传的日志文件:t-2020-7-26-1-19-45.log。 【补充】配置信息直接在代码中写死通常应该从配置文件中读取为方便读者阅读本代码没有增加该功能FTP服务器搭建本文没有说明相关文件比较多大家可以自行搜索一口君用的是File zilla 通常这种需要长时间运行的程序需要设置成守护进程本文没有添加相应功能读者可以自行搜索。如果强烈要求可以单开一篇详细介绍。代码中time的管理函数请读者自行搜索相关文章。curl也提供了相关的函数库curl.lib如果要实现更灵活的功能可以使用对应的api。之所以先把文件拷贝成备份文件主要是考虑其他模块随时可能修改日志文件起到一定保护作用。想和博主交流请关注公众号「一口Linux」