curl post https_Linux命令cURL详解,并实现文件定时上传到ftp服务器的程序

ac4272fe173d47cac985dad989f63f2f.png

前言

5dac42efe0214f754256ac673099e231.png

前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现。我记得之前做过 一个项目:为高通的iot模组编写FOTA功能:实现模组可以远程下载升级镜像包,实现版本升级功能。并当时使用的一个超级强大的工具cURL。心血来潮,决定专门写一篇文章,送给需要的朋友。

文章分两部分

  1. 首先介绍cURL的用法;
  2. 实现一个定时上传日志文件的一个简单的程序。

8c39b9b8bcda4a2b6880f4cef5fd5679.png

概念

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:password@hostname)。

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-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">

五、Linux curl命令退出码:

下面是linux curl命令的错误代码和她们的相应的错误消息,命令执行错误的时候可以通过错误码来查看出错原因,方便开发调试。

ble data-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">

六、用法演示:

为节省篇幅,部分操作不再贴上执行结果。

1、查看网页源码

直接在curl命令后加上网址,就可以看到网页源码。我们以网址http://www.sina.com为例(选择该网址,主要因为它的网页代码较短):

root@ubuntu:/home/peng# curl www.sohu.com
<html>
<head><title>307 Temporary Redirect</title></head>
<body bgcolor="white">
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>nginx</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的头信息,连同网页代码一起。

root@ubuntu:/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.3062915<html>
<head><title>307 Temporary Redirect</title></head>
<body bgcolor="white">
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>nginx</center>
</body>
</html>

-I参数则是只显示http response的头信息。

4、显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。

root@ubuntu:/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... connected
> GET / HTTP/1.1
> User-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.3
> Host: www.sohu.com
> Accept: */*
> 
< HTTP/1.1 307 Temporary Redirect
< Content-Type: text/html
< Content-Length: 180
< Connection: keep-alive
< Server: nginx
< Date: Tue, 25 Aug 2020 10:11:49 GMT
< Location: https://www.sohu.com/
< FSS-Cache: from 9855973.18375663.10534247
< FSS-Proxy: Powered by 2450292.3564414.3128453
< 
<html>
<head><title>307 Temporary Redirect</title></head>
<body bgcolor="white">
<center><h1>307 Temporary Redirect</h1></center>
<hr><center>nginx</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?data=xxx

POST方法必须把数据和网址分开,curl就要用到--data参数。

curl -X POST --data "data=xxx" example.com/form.cgi

如果你的数据没有经过表单编码,还可以让curl为你编码,参数是--data-urlencode

curl -X POST--data-urlencode "date=April 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 method="POST" enctype='multipart/form-data' action="upload.cgi"><input type=file name=upload><input type=submit name=press value="OK">
</form>

你可以用curl这样上传文件:

curl --form upload=@localfilename --form press=OK [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 "name=xxx" 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.net

13、FTP

1)、列出ftp服务器上的目录列表

curl ftp://www.xxx.com/ --user name:passwd
curl ftp://www.xxx.com/ –u name:passwd #简洁写法
curl ftp://name:passwd@www.xxx.com #简洁写法2

例如:在IP地址192.168.43.117上搭建FTP服务器,并设置用户名为user,密码为123456 现在我们要显示服务器上根目录下的所有文件信息,命令如下:

curl -u user:123456 ftp://192.168.43.117

执行结果如下:

5a32901698213f4ffa365d1db22e9729.png

简洁写法:

curl ftp://user:123456@192.168.43.117

执行结果如下:

9452882f721da7b68b3677e79f540090.png

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:123456@192.168.43.117/test.c -o test.c

执行结果如下:

7eb62a9c21a83d3c2d07e3f8f0f4b95c.png

简洁模式

curl -u user:123456 ftp://192.168.43.117/list.h -o list.h

执行结果如下:

eecea1d08b437a93ab06651fdb8ba198.png

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

22f5b25ca70cab091da525b7129a21a2.png

可以看到文件并没有上传成功,返回错误码是25,参考第五章

25 FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.

可知,是因为服务器没有赋予存储的权限,所以设置服务器的write权限即可。

953691f6d0d80ca2f0de7c9c6cadbce0.png

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字母大写

六、实现日志文件定时上传

功能

  1. 程序运行时要记录当前日志文件的最后修改时间;
  2. 每个10秒钟就检查下log文件是否被修改,如果没有被修改就休眠10秒钟;
  3. 如果log文件被修改了,就将当前的日志文件拷贝成备份文件,备份文件名字加上当前时间;
  4. 通过curl发送给ftp服务器;
  5. 删除备份文件,重复步骤2。

程序流程图如下:

d090d36e6553104047c444b512066a45.png

函数功能介绍

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.h>typedef 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_year+1900,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); }
}

运行截图:

第一步:

57a35bb4ba1e7585e787b2a60357dccf.png

因为log文件没有被修改过,所以程序不会上传。

第二步: 手动输入字符串 yikoulinux 到日志文件 t.log中。

3b1bd3c2c3f24a171906d302f6a15511.png

第三步: 因为文件发生了改变,所以打印“file updated”,同时可以看到curl上传文件的log信息。

d01968bc90f66f38f70854e09071718a.png

以下是FTP服务器的根目录,可以看到,上传的日志文件:t-2020-7-26-1-19-45.log

e5b7c234af417838e557db676e647bd6.png

【补充】

  1. 配置信息,直接在代码中写死,通常应该从配置文件中读取,为方便读者阅读,本代码没有增加该功能;
  2. FTP服务器搭建,本文没有说明,相关文件比较多,大家可以自行搜索,一口君用的是File zilla;

e0e6858b08dd013edb9caa7813c65f1d.png
  1. 通常这种需要长时间运行的程序,需要设置成守护进程,本文没有添加相应功能,读者可以自行搜索。如果强烈要求可以单开一篇详细介绍。
  2. 代码中time的管理函数,请读者自行搜索相关文章。
  3. curl也提供了相关的函数库curl.lib,如果要实现更灵活的功能可以使用对应的api。
  4. 之所以先把文件拷贝成备份文件,主要是考虑其他模块随时可能修改日志文件,起到一定保护作用。

想和博主交流,请关注公众号「一口Linux」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统页面缓存,Linux缓存机制之页缓存

内核采用一种通用的地址空间方案&#xff0c;来建立缓存数据与其来源之间的关联。1) 内存中的页分配到每个地址空间。这些页的内容可以由用户进程或内核本身使用各式各样的方法操作。这些数据表示了缓存中的内容&#xff1b;2) 后备存储器struct backing_dev_info指定了填充地…

十月百度,阿里巴巴,迅雷搜狗最新面试七十题(更新至10.17)

十月百度&#xff0c;阿里巴巴&#xff0c;迅雷搜狗最新面试十一题 引言 当即早已进入10月份&#xff0c;十一过后&#xff0c;招聘&#xff0c;笔试&#xff0c;面试&#xff0c;求职渐趋火热。而在这一系列过程背后浮出的各大IT公司的笔试/面试题则蕴含着诸多思想与设计&…

fasttext 文本分类_4种常见的NLP实践思路【特征提取+分类模型】

越来越多的人选择参加算法赛事&#xff0c;为了提升项目实践能力&#xff0c;同时也希望能拿到好的成绩增加履历的丰富度。期望如此美好&#xff0c;现实却是&#xff1a;看完赛题&#xff0c;一点思路都木有。那么&#xff0c;当我们拿到一个算法赛题后&#xff0c;如何破题&a…

Angular4学习笔记(六)- Input和Output

概述 Angular中的输入输出是通过注解Input和Output来标识&#xff0c;它位于组件控制器的属性上方。 输入输出针对的对象是父子组件。 演示 Input 新建项目connInComponents:ng new connInComponents.新增组件stock:ng g component stock.在stock.component.ts中新增属性stockN…

Python 常见加密方式和实现

Python 加密与解密小结 这篇文章主要介绍了Python 加密与解密,使用base64或pycrypto模块 前言 据记载&#xff0c;公元前400年&#xff0c;古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间&#xff0c;德国军方启用“恩尼格玛”密码机…

jenkins日志乱码linux,Jenkins控制台中乱码问题解决

由于服务器环境及应用层各版本的不同、编码方式的不同因此会有很多种情况会出现乱码问题。由于Jenkins中的job运行的是独立的一个shell环境&#xff0c;许多的环境变量与服务器中是不一样的&#xff0c;因此在job中执行的命令也就会有所差异。因此可以在job中执行env命令&#…

windows商店_Windows记事本应用现在可以从Microsoft Store中获得

早在2019年8月&#xff0c;微软就宣布将把人们最常用的Windows记事本应用搬到应用商店&#xff0c;让这款深受用户喜爱的应用更新速度更快、响应更灵敏。12月晚些时候&#xff0c;微软却放弃了这一计划&#xff0c;也没有给出太多理由。但现在&#xff0c;这一计划已经完成&…

jmeter 压测duobbo接口,施压客户端自己把自己压死了

jmeter 压测duobbo接口&#xff0c;jmeter代码不合理&#xff0c;导致每执行一次请求&#xff0c;会调用一次消耗内存的实例化。导致越压越慢&#xff0c;请求发不出去。这个时候需要考虑修改代码了。 截图中&#xff0c;tps越来越少。 原来初始化的代码放在 runTest中执行。修…

oracle pl/sql 包

包用于在逻辑上组合过程和函数&#xff0c;它由包规范和包体两部分组成。1)、我们可以使用create package命令来创建包&#xff0c;如&#xff1a;i、创建一个包sp_packageii、声明该包有一个过程update_saliii、声明该包有一个函数annual_income --声明该包有一个存储过程和一…

背单词软件 单词风暴 分享id_周一考研高效背单词系列(一):利用单词软件如何背好单词...

高效背单词考研单词作为考研路上的第一大难关&#xff0c;相信很多小伙伴都在这上面吃过不少苦&#xff0c;有同学更是看到密密麻麻的大纲词汇就头疼&#xff0c;但只要是学习就是有方法的&#xff0c;今天&#xff0c;我们开始推出高效背单词系列——墨墨背单词。另&#xff1…

linux c++ 编译 库,LINUX C/C++ 编译库关系

在LINUX 下安装个啥,都要涉及到编译,尤其是开源软件. 那么编译就涉及到C/C 和对应的库. 我们理一理之间的关系有助于MYSQL8源码编译libc glibc libc libstdc eglibc GCC G CMakeGDB从libc说起。libc是Linux下原来的标准C库&#xff0c;也就是当初写hello world时包含的头文件#…

Linux_学习_Day3_bash

Shell bash是外部程序&#xff1a;type/whichis bash。 shell&#xff0c; 子shell。可以利用bash打开另一个bash。即打开一个子shell。并且每个进程是独立存在的。对于子shell而言&#xff0c;bash并不认知其他bash的存在。 执行了多次bash&#xff0c;要退出只需exit。用pst…

mysql 之 优化 (收集于网络)

&#xff08;以下内容均来自于网络&#xff0c;如果有版权限制&#xff0c;请联系我0.0&#xff09; Mysql存储千亿级的数据&#xff0c;是一项非常大的挑战。Mysql单表可以存储10亿级的数据&#xff0c;只是这个时候性能非常差&#xff0c;项目中大量的实验证明&#xff0c;M…

easyui 收费_收费班长喻玉华三尺岗亭献青春

- 2020 第四期 人物访谈报道 -拼搏人生最美励志先锋人物专访2013年&#xff0c;22岁的她来到巴南高速这个大家庭中&#xff0c;成为恩阳收费站一名普通的收费员。怀着对事业的执着追求与热爱&#xff0c;经过两年不懈的努力&#xff0c;获得了领导和同事的认可和喜爱。2015年5月…

编程技术面试的五大要点

&#xff08;写在前面的话&#xff1a;本文最初发表于《程序员》杂志2011年10月刊&#xff0c;并收录到《剑指Offer——名企面试官精讲典型编程题》一书中。&#xff09; 近年来找工作一直是一个很热门的话题。我们要想找到心仪的工作&#xff0c;难免需要经过很多轮面试。编程…

山西台达plc可编程控制器_可编程控制器2(PLC)控制原理

采用继电器控制采用PC控制PC的控制原理(继电器PC控制)a)当SB1按下&#xff0c;输入继电器00000的线圈通电&#xff0c;00000的常开触点闭合&#xff0c;使得输出继电器01000的线圈得电&#xff0c;01000对应的硬输出触电闭合&#xff0c;KM1得电M1开始运转&#xff0c;同时0100…

一篇读懂 可转债

可转债兴起的原因 可转债是1992年底开始进入中国证券市场的&#xff0c;到现在已经27个年头了。可以说&#xff0c;以前可转债在中国证券市场一直不是市场的焦点和幸运儿&#xff0c;始终没能成为一个上规模的可配置的投资品种——其原因很简单&#xff0c;因为相对而言企业发…

bodhi linux 安装 ubuntu软件,Bodhi Linux 5.1.0 发布,基于Ubuntu的轻量级发行版

Bodhi Linux是基于Ubuntu的轻量级发行版&#xff0c;具有Moksha桌面环境。现在有很多Linux发行版。有些是独特的&#xff0c;但很多是重复的&#xff0c;可能没有存在的必要。由于使用了Moksha桌面环境&#xff0c;一个基于Linux的操作系统Bodhi脱颖而出。如果你不熟悉Bodhi&am…

idc机房运维巡检_智和信通赋能国产信创 建设IT智能监控运维体系 - 蔚颖willing...

作为信创领域深耕多年的企业&#xff0c;北京智和信通技术有限公司始终坚持研发自主知识产权的IT智能运维监控大数据分析系统——智和网管平台SugarNMS&#xff0c;积极探索AIOps智能运维&#xff0c;通过“国产安全监控分析安管日志运维开发”七合一模式&#xff0c;赋能IDC数…

用Python的Tultle模块创建一个五角星

方案所需准备Python官方手册。 这里是我找到的中文版。一个可执行Python的解释器Ttultle简介来源乌龟图形是一个不错的方式来为孩子们介绍编程。它是Wally Feurzig和Seymour Papert在1966年开发的原始Logo编程语言的一部分。想象一只在x-y平面上&#xff0c;从&#xff08;0,0&…