Jekyll2022-12-12T10:28:17+00:00https://thredreams.github.io/feed.xml大梦阁君子虽不玩物丧志,亦常借境调心。Gpg密钥与签名2022-12-11T00:00:00+00:002022-12-11T00:00:00+00:00https://thredreams.github.io/2022/12/11/GPG%E5%AF%86%E9%92%A5%E4%B8%8E%E7%AD%BE%E5%90%8D<p>https://blog.51cto.com/u_12772149/2609241
https://bbs.huaweicloud.com/blogs/290331
https://spwo.notion.site/GitHub-6b1e1d57f52c4664bff61cadb3f9cb8d#d50ec6892bf545f6bb8efea626059123
https://stackoverflow.com/questions/61067967/git-gpg-failed-to-sign-the-data-in-visual-studio-code</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gpg <span class="nt">--gen-key</span>
gpg <span class="nt">-K</span> <span class="c"># 列出私钥</span>
gpg <span class="nt">-k</span> <span class="c"># 列出公钥</span>
gpg <span class="nt">--import</span> public-file.key
gpg <span class="nt">--list-secret-keys</span>
gpg <span class="nt">--armor</span> <span class="nt">--output</span> public-key.txt <span class="nt">--export</span> 63ECA75D
gpg <span class="nt">-a</span> <span class="nt">-o</span> private-file.key <span class="nt">--export-secret-keys</span> 63ECA75D
gpg <span class="nt">--armor</span> <span class="nt">--export</span> 383F63B363ECA75D
<span class="c"># 为了可以输入密码,加入shell的配置文件</span>
<span class="nb">export </span><span class="nv">GPG_TTY</span><span class="o">=</span><span class="si">$(</span><span class="nb">tty</span><span class="si">)</span>
git config <span class="nt">--global</span> user.signingkey 63ECA75D
git config <span class="nt">--global</span> commit.gpgsign <span class="nb">true
</span>git config <span class="nt">--global</span> user.name <span class="s2">"thredreams"</span>
git config <span class="nt">--global</span> user.email <span class="s2">"[email protected]"</span>
git config <span class="nt">--global</span> <span class="nt">-l</span>
git config <span class="nt">-l</span>
git remote add origin [email protected]:envoyproxy/gateway.git
git remote remove myEnvoyGateway
git remote add myEnvoyGateway [email protected]:thredreams/gateway.git
<span class="c"># 查看仓库</span>
git remote <span class="nt">-v</span>
git log <span class="nt">--show-signature</span>
<span class="c">#如果gpg使用错误</span>
git config <span class="nt">--global</span> gpg.program /usr/bin/gpg
git config <span class="nt">--global</span> gpg.program gpg1
</code></pre></div></div>
<p>#git</p>
<h2 id="安装gpg">安装gpg</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Centos
yum install gnupg
# Ubuntu
apt install gpg
# windows 一般用不上实在要用,可以用git自带的,应该在Git的安装目录的Git/usr/bin目录下
# 或者使用WSL,在WSL环境中安装,
# 或者真要装,还可以使用scoop安装
</code></pre></div></div>
<h1 id="gpg-导致的you-need-a-passphrase-to-unlock-the-secret-key-for-user-处理方法">GPG 导致的You need a passphrase to unlock the secret key for user 处理方法</h1>
<p>可以通过</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gpg <span class="nt">-s</span> tmp_file_name
</code></pre></div></div>
<p>来打开密码输入页面, 输入密码后再继续<a href="https://so.csdn.net/so/search?q=commit&spm=1001.2101.3001.7020">commit</a> 即可。tmp_file_name 这个文件可以不存在, 就是给输入密码一个机会。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit <span class="nt">-S</span> <span class="nt">-m</span> <span class="s2">"comment for new commit"</span>
git commit <span class="nt">-s</span> <span class="nt">-m</span> <span class="s2">"注意下面只是在commit message里添加内容"</span>
</code></pre></div></div>
<h2 id="上次提交没有签名">上次提交没有签名</h2>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
# 为上次提交签名,需要输入密码
git commit --amend -S -m "add -e to echo command" -s
# 查看签名结果
git log
# 将本地仓库强制覆盖远程仓库
git push orgin -f
</code></pre></div></div>
<h1 id="gpg-skipped-383f63b363eca75d-no-secret-key">gpg: skipped “383F63B363ECA75D”: No secret key</h1>
<p>git 默认使用的是 Git\usr\bin 目录下的 gpg. exe、使用 everything 搜索一下有几个 gpg. exe,然后使用上面说的内容修改一下 git 使用的 gpg 程序就好了。</p>https://blog.51cto.com/u_12772149/2609241 https://bbs.huaweicloud.com/blogs/290331 https://spwo.notion.site/GitHub-6b1e1d57f52c4664bff61cadb3f9cb8d#d50ec6892bf545f6bb8efea626059123 https://stackoverflow.com/questions/61067967/git-gpg-failed-to-sign-the-data-in-visual-studio-codeWelcome to Jekyll!2022-12-10T14:30:53+00:002022-12-10T14:30:53+00:00https://thredreams.github.io/jekyll/update/2022/12/10/welcome-to-jekyll<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p>
<p>Jekyll requires blog post files to be named according to the following format:</p>
<p><code class="language-plaintext highlighter-rouge">YEAR-MONTH-DAY-title.MARKUP</code></p>
<p>Where <code class="language-plaintext highlighter-rouge">YEAR</code> is a four-digit number, <code class="language-plaintext highlighter-rouge">MONTH</code> and <code class="language-plaintext highlighter-rouge">DAY</code> are both two-digit numbers, and <code class="language-plaintext highlighter-rouge">MARKUP</code> is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p>
<p>Jekyll also offers powerful support for code snippets:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=> prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>
<p>Check out the <a href="https://jekyllrb.com/docs/home">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://talk.jekyllrb.com/">Jekyll Talk</a>.</p>You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated. Jekyll requires blog post files to be named according to the following format: YEAR-MONTH-DAY-title.MARKUP Where YEAR is a four-digit number, MONTH and DAY are both two-digit numbers, and MARKUP is the file extension representing the format used in the file. After that, include the necessary front matter. Take a look at the source for this post to get an idea about how it works. Jekyll also offers powerful support for code snippets: def print_hi(name) puts "Hi, #{name}" end print_hi('Tom') #=> prints 'Hi, Tom' to STDOUT. Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk.Git2022-12-10T00:00:00+00:002022-12-10T00:00:00+00:00https://thredreams.github.io/2022/12/10/git<p>#SSH #git</p>
<h1 id="上下游同步">上下游同步</h1>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># vscode git error: would clobber existing tag</span>
<span class="c"># 对本地代码tag的强制更新</span>
git fetch <span class="nt">--tags</span> <span class="nt">-f</span>
<span class="c"># git push错误:ssh:Could not resolve hostname gitee.com:Name or service not known</span>
ssh <span class="nt">-T</span> [email protected]
ping github.com
https://juejin.cn/post/7129443602379309086
<span class="c"># 拉取上游</span>
git branch <span class="nt">--set-upstream-to</span><span class="o">=</span>myEnvoyGateway/main main
git pull upstream develop
</code></pre></div></div>#SSH #git⚠开源黑话2022-12-10T00:00:00+00:002022-12-10T00:00:00+00:00https://thredreams.github.io/2022/12/10/%E2%9A%A0%E5%BC%80%E6%BA%90%E9%BB%91%E8%AF%9D<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>RTFM — 是一个网络语言,意思是:“去读那些他妈的手册”(Read The Fucking Manual),这句话通常用在回复那些只要查阅文件就可以解决,拿出来提问只是浪费别人时间的问题。
AFAIK/AFAICT — as far as I know / can tell
LGTM — Looks good to me.
IANAL — “ I am not a lawyer ”, but I smell licensing issues
IMO — (In my opinion),在我看来
TL;DR — Too Long; Didn't Read 「太长懒得看」,README 文档常见。
PTAL — Please Take A Look. 你来瞅瞅?用来提示别人来看一下
TBR — To Be Reviewed. 提示维护者进行 review
TBD — To Be Done(or Defined/Discussed/Decided/Determined). 根据语境不同意义有所区别,但一般都是还没搞定的意思。
TBH — To be honest 「老实说」
atm — at the moment 「现阶段」
WDYT -- What Do You Think?
</code></pre></div></div>
<p><img src="https://github-readme-stats.vercel.app/api/top-langs/?username=thredreams&layout=compact" alt="Top Langs" /></p>
<p><img src="https://github-readme-stats.vercel.app/api?username=thredreams&show_icons=true&count_private=true&theme=transparent" alt="Github Stats" /></p>
<p><a href=" https://github.com/anuraghazra/github-readme-stats">
<img align="center" src=" https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=github-readme-stats" />
</a>
<a href=" https://github.com/anuraghazra/convoychat">
<img align="center" src=" https://github-readme-stats.vercel.app/api/pin/?username=anuraghazra&repo=convoychat" />
</a></p>
<h1 align="center">Hi 👋, I'm thredreams</h1>
<h3 align="center">君子虽不玩物丧志,亦常借境调心。</h3>
<ul>
<li>🌱 I’m currently learning <strong>Gateway</strong></li>
</ul>RTFM — 是一个网络语言,意思是:“去读那些他妈的手册”(Read The Fucking Manual),这句话通常用在回复那些只要查阅文件就可以解决,拿出来提问只是浪费别人时间的问题。 AFAIK/AFAICT — as far as I know / can tell LGTM — Looks good to me. IANAL — “ I am not a lawyer ”, but I smell licensing issues IMO — (In my opinion),在我看来 TL;DR — Too Long; Didn't Read 「太长懒得看」,README 文档常见。 PTAL — Please Take A Look. 你来瞅瞅?用来提示别人来看一下 TBR — To Be Reviewed. 提示维护者进行 review TBD — To Be Done(or Defined/Discussed/Decided/Determined). 根据语境不同意义有所区别,但一般都是还没搞定的意思。 TBH — To be honest 「老实说」 atm — at the moment 「现阶段」 WDYT -- What Do You Think?镜像源配置2022-12-10T00:00:00+00:002022-12-10T00:00:00+00:00https://thredreams.github.io/2022/12/10/%E9%95%9C%E5%83%8F%E6%BA%90%E9%85%8D%E7%BD%AE<h2 id="pip源">pip源</h2>
<p>https://blog.csdn.net/Chennybaba/article/details/108083944</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip3 config <span class="nb">set </span>global.index-url http://mirrors.aliyun.com/pypi/simple/
pip3 config <span class="nb">set </span>global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
pip3 config <span class="nb">set </span>global.index-url https://pypi.douban.com/simple/
</code></pre></div></div>
<h2 id="git-源">git 源</h2>
<p>#git
使用 github 脚本实现,</p>
<h1 id="ruby-源">ruby 源</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
gem sources -l
</code></pre></div></div>pip源Make2022-12-09T00:00:00+00:002022-12-09T00:00:00+00:00https://thredreams.github.io/2022/12/09/make<p>https://www.ruanyifeng.com/blog/2015/02/make.html</p>
<h2 id="一make的概念">一、Make的概念</h2>
<p>Make这个词,英语的意思是”制作”。Make命令直接用了这个意思,就是要做出某个文件。比如,要做出文件a.txt,就可以执行下面的命令。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make a.txt
</code></pre></div></div>
<p>但是,如果你真的输入这条命令,它并不会起作用。因为Make命令本身并不知道,如何做出a.txt,需要有人告诉它,如何调用其他命令完成这个目标。</p>
<p>比如,假设文件 a.txt 依赖于 b.txt 和 c.txt ,是后面两个文件连接(cat命令)的产物。那么,make 需要知道下面的规则。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> a.txt: b.txt c.txt
<span class="nb">cat </span>b.txt c.txt a.txt
</code></pre></div></div>
<p>也就是说,make a.txt 这条命令的背后,实际上分成两步:第一步,确认 b.txt 和 c.txt 必须已经存在,第二步使用 cat 命令 将这个两个文件合并,输出为新文件。</p>
<p>像这样的规则,都写在一个叫做Makefile的文件中,Make命令依赖这个文件进行构建。Makefile文件也可以写为makefile, 或者用命令行参数指定为其他文件名。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make <span class="nt">-f</span> rules.txt
<span class="c"># 或者</span>
<span class="nv">$ </span>make <span class="nt">--file</span><span class="o">=</span>rules.txt
</code></pre></div></div>
<p>上面代码指定make命令依据rules.txt文件中的规则,进行构建。</p>
<p>总之,make只是一个根据指定的Shell命令进行构建的工具。它的规则很简单,你规定要构建哪个文件、它依赖哪些源文件,当那些文件有变动时,如何重新构建它。</p>
<h2 id="二makefile文件的格式">二、Makefile文件的格式</h2>
<p>构建规则都写在Makefile文件里面,要学会如何Make命令,就必须学会如何编写Makefile文件。</p>
<h3 id="21-概述">2.1 概述</h3>
<p>Makefile文件由一系列规则(rules)构成。每条规则的形式如下。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <target> : <prerequisites>
<span class="o">[</span>tab] <commands>
</code></pre></div></div>
<p>上面第一行冒号前面的部分,叫做”目标”(target),冒号后面的部分叫做”前置条件”(prerequisites);第二行必须由一个tab键起首,后面跟着”命令”(commands)。</p>
<p>“目标”是必需的,不可省略;”前置条件”和”命令”都是可选的,但是两者之中必须至少存在一个。</p>
<p>每条规则就明确两件事:构建目标的前置条件是什么,以及如何构建。下面就详细讲解,每条规则的这三个组成部分。</p>
<h3 id="22-目标target">2.2 目标(target)</h3>
<p>一个目标(target)就构成一条规则。目标通常是文件名,指明Make命令所要构建的对象,比如上文的 a.txt 。目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。</p>
<p>除了文件名,目标还可以是某个操作的名字,这称为”伪目标”(phony target)。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> clean:
<span class="nb">rm</span> <span class="k">*</span>.o
</code></pre></div></div>
<p>上面代码的目标是clean,它不是文件名,而是一个操作的名字,属于”伪目标 “,作用是删除对象文件。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make clean
</code></pre></div></div>
<p>但是,如果当前目录中,正好有一个文件叫做clean,那么这个命令不会执行。因为Make发现clean文件已经存在,就认为没有必要重新构建了,就不会执行指定的rm命令。</p>
<p>为了避免这种情况,可以明确声明clean是”伪目标”,写法如下。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> .PHONY: clean
clean:
<span class="nb">rm</span> <span class="k">*</span>.o temp
</code></pre></div></div>
<p>声明clean是”伪目标”之后,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令。像.PHONY这样的内置目标名还有不少,可以查看<a href="https://www.gnu.org/software/make/manual/html_node/Special-Targets.html#Special-Targets">手册</a>。</p>
<p>如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make
</code></pre></div></div>
<p>上面代码执行Makefile文件的第一个目标。</p>
<h3 id="23-前置条件prerequisites">2.3 前置条件(prerequisites)</h3>
<p>前置条件通常是一组文件名,之间用空格分隔。它指定了”目标”是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),”目标”就需要重新构建。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> result.txt: source.txt
<span class="nb">cp </span>source.txt result.txt
</code></pre></div></div>
<p>上面代码中,构建 result.txt 的前置条件是 source.txt 。如果当前目录中,source.txt 已经存在,那么<code class="language-plaintext highlighter-rouge">make result.txt</code>可以正常运行,否则必须再写一条规则,来生成 source.txt 。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> source.txt:
<span class="nb">echo</span> <span class="s2">"this is the source"</span> <span class="o">></span> source.txt
</code></pre></div></div>
<p>上面代码中,source.txt后面没有前置条件,就意味着它跟其他文件都无关,只要这个文件还不存在,每次调用<code class="language-plaintext highlighter-rouge">make source.txt</code>,它都会生成。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make result.txt
<span class="nv">$ </span>make result.txt
</code></pre></div></div>
<p>上面命令连续执行两次<code class="language-plaintext highlighter-rouge">make result.txt</code>。第一次执行会先新建 source.txt,然后再新建 result.txt。第二次执行,Make发现 source.txt 没有变动(时间戳晚于 result.txt),就不会执行任何操作,result.txt 也不会重新生成。</p>
<p>如果需要生成多个文件,往往采用下面的写法。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nb">source</span>: file1 file2 file3
</code></pre></div></div>
<p>上面代码中,source 是一个伪目标,只有三个前置文件,没有任何对应的命令。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make <span class="nb">source</span>
</code></pre></div></div>
<p>执行<code class="language-plaintext highlighter-rouge">make source</code>命令后,就会一次性生成 file1,file2,file3 三个文件。这比下面的写法要方便很多。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span>make file1
<span class="nv">$ </span>make file2
<span class="nv">$ </span>make file3
</code></pre></div></div>
<h3 id="24-命令commands">2.4 命令(commands)</h3>
<p>命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建”目标”的具体指令,它的运行结果通常就是生成目标文件。</p>
<p>每行命令之前必须有一个tab键。如果想用其他键,可以用内置变量.RECIPEPREFIX声明。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> .RECIPEPREFIX <span class="o">=</span> <span class="o">></span>
all:
<span class="o">></span> <span class="nb">echo </span>Hello, world
</code></pre></div></div>
<p>上面代码用.RECIPEPREFIX指定,大于号(>)替代tab键。所以,每一行命令的起首变成了大于号,而不是tab键。</p>
<p>需要注意的是,每行命令在一个单独的shell中执行。这些Shell之间没有继承关系。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var-lost:
<span class="nb">export </span><span class="nv">foo</span><span class="o">=</span>bar
<span class="nb">echo</span> <span class="s2">"foo=[</span><span class="nv">$$</span><span class="s2">foo]"</span>
</code></pre></div></div>
<p>上面代码执行后(<code class="language-plaintext highlighter-rouge">make var-lost</code>),取不到foo的值。因为两行命令在两个不同的进程执行。一个解决办法是将两行命令写在一行,中间用分号分隔。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var-kept:
<span class="nb">export </span><span class="nv">foo</span><span class="o">=</span>bar<span class="p">;</span> <span class="nb">echo</span> <span class="s2">"foo=[</span><span class="nv">$$</span><span class="s2">foo]"</span>
</code></pre></div></div>
<p>另一个解决办法是在换行符前加反斜杠转义。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> var-kept:
<span class="nb">export </span><span class="nv">foo</span><span class="o">=</span>bar<span class="p">;</span> <span class="se">\</span>
<span class="nb">echo</span> <span class="s2">"foo=[</span><span class="nv">$$</span><span class="s2">foo]"</span>
</code></pre></div></div>
<p>最后一个方法是加上<code class="language-plaintext highlighter-rouge">.ONESHELL:</code>命令。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> .ONESHELL:
var-kept:
<span class="nb">export </span><span class="nv">foo</span><span class="o">=</span>bar<span class="p">;</span>
<span class="nb">echo</span> <span class="s2">"foo=[</span><span class="nv">$$</span><span class="s2">foo]"</span>
</code></pre></div></div>
<h2 id="三makefile文件的语法">三、Makefile文件的语法</h2>
<h3 id="31-注释">3.1 注释</h3>
<p>井号(#)在Makefile中表示注释。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c"># 这是注释</span>
result.txt: source.txt
<span class="c"># 这是注释</span>
<span class="nb">cp </span>source.txt result.txt <span class="c"># 这也是注释</span>
</code></pre></div></div>
<h3 id="32-回声echoing">3.2 回声(echoing)</h3>
<p>正常情况下,make会打印每条命令,然后再执行,这就叫做回声(echoing)。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nb">test</span>:
<span class="c"># 这是测试</span>
</code></pre></div></div>
<p>执行上面的规则,会得到下面的结果。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nv">$ </span>make <span class="nb">test</span>
<span class="c"># 这是测试</span>
</code></pre></div></div>
<p>在命令的前面加上@,就可以关闭回声。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nb">test</span>:
@# 这是测试
</code></pre></div></div>
<p>现在再执行<code class="language-plaintext highlighter-rouge">make test</code>,就不会有任何输出。</p>
<p>由于在构建过程中,需要了解当前在执行哪条命令,所以通常只在注释和纯显示的echo命令前面加上@。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nb">test</span>:
@# 这是测试
@echo TODO
</code></pre></div></div>
<h3 id="33-通配符">3.3 通配符</h3>
<p>通配符(wildcard)用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 […] 。比如, *.o 表示所有后缀名为o的文件。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
clean:
<span class="nb">rm</span> <span class="nt">-f</span> <span class="k">*</span>.o
</code></pre></div></div>
<h3 id="34-模式匹配">3.4 模式匹配</h3>
<p>Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%。比如,假定当前目录下有 f1.c 和 f2.c 两个源码文件,需要将它们编译为对应的对象文件。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
%.o: %.c
</code></pre></div></div>
<p>等同于下面的写法。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
f1.o: f1.c
f2.o: f2.c
</code></pre></div></div>
<p>使用匹配符%,可以将大量同类型的文件,只用一条规则就完成构建。</p>
<h3 id="35-变量和赋值符">3.5 变量和赋值符</h3>
<p>Makefile 允许使用等号自定义变量。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
txt <span class="o">=</span> Hello World
<span class="nb">test</span>:
@echo <span class="si">$(</span>txt<span class="si">)</span>
</code></pre></div></div>
<p>上面代码中,变量 txt 等于 Hello World。调用时,变量需要放在 $( ) 之中。</p>
<p>调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nb">test</span>:
@echo <span class="nv">$$</span>HOME
</code></pre></div></div>
<p>有时,变量的值可能指向另一个变量。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
v1 <span class="o">=</span> <span class="si">$(</span>v2<span class="si">)</span>
</code></pre></div></div>
<p>上面代码中,变量 v1 的值是另一个变量 v2。这时会产生一个问题,v1 的值到底在定义时扩展(静态扩展),还是在运行时扩展(动态扩展)?如果 v2 的值是动态的,这两种扩展方式的结果可能会差异很大。</p>
<p>为了解决类似问题,Makefile一共提供了四个赋值运算符 (=、:=、?=、+=),它们的区别请看<a href="https://stackoverflow.com/questions/448910/makefile-variable-assignment">StackOverflow</a>。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
VARIABLE <span class="o">=</span> value
<span class="c"># 在执行时扩展,允许递归扩展。</span>
VARIABLE :<span class="o">=</span> value
<span class="c"># 在定义时扩展。</span>
VARIABLE ?<span class="o">=</span> value
<span class="c"># 只有在该变量为空时才设置值。</span>
VARIABLE +<span class="o">=</span> value
<span class="c"># 将值追加到变量的尾端。</span>
</code></pre></div></div>
<h3 id="36-内置变量implicit-variables">3.6 内置变量(Implicit Variables)</h3>
<p>Make命令提供一系列内置变量,比如,$(CC) 指向当前使用的编译器,$(MAKE) 指向当前使用的Make工具。这主要是为了跨平台的兼容性,详细的内置变量清单见<a href="https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html">手册</a>。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
output:
<span class="si">$(</span>CC<span class="si">)</span> <span class="nt">-o</span> output input.c
</code></pre></div></div>
<h3 id="37-自动变量automatic-variables">3.7 自动变量(Automatic Variables)</h3>
<p>Make命令还提供一些自动变量,它们的值与当前规则有关。主要有以下几个。</p>
<p><strong>(1)$@</strong></p>
<p>$@指代当前目标,就是Make命令当前构建的那个目标。比如,<code class="language-plaintext highlighter-rouge">make foo</code>的 $@ 就指代foo。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
a.txt b.txt:
<span class="nb">touch</span> <span class="nv">$@</span>
</code></pre></div></div>
<p>等同于下面的写法。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
a.txt:
<span class="nb">touch </span>a.txt
b.txt:
<span class="nb">touch </span>b.txt
</code></pre></div></div>
<p><strong>(2)$<</strong></p>
<p>$< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
a.txt: b.txt c.txt
<span class="nb">cp</span> <span class="nv">$<</span> <span class="nv">$@</span>
</code></pre></div></div>
<p>等同于下面的写法。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
a.txt: b.txt c.txt
<span class="nb">cp </span>b.txt a.txt
</code></pre></div></div>
<p><strong>(3)$?</strong></p>
<p>$? 指代比目标更新的所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。</p>
<p><strong>(4)$^</strong></p>
<p>$^ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2 。</p>
<p><strong>(5)$</strong>*</p>
<p>$* 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。</p>
<p><strong>(6)$(@D) 和 $(@F)</strong></p>
<p>$(@D) 和 $(@F) 分别指向 $@ 的目录名和文件名。比如,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。</p>
<p><strong>(7)$(<D) 和 $(<F)</strong></p>
<p>$(<D) 和 $(<F) 分别指向 $< 的目录名和文件名。</p>
<p>所有的自动变量清单,请看<a href="https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html">手册</a>。下面是自动变量的一个例子。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
dest/%.txt: src/%.txt
@[ <span class="nt">-d</span> dest <span class="o">]</span> <span class="o">||</span> <span class="nb">mkdir </span>dest
<span class="nb">cp</span> <span class="nv">$<</span> <span class="nv">$@</span>
</code></pre></div></div>
<p>上面代码将 src 目录下的 txt 文件,拷贝到 dest 目录下。首先判断 dest 目录是否存在,如果不存在就新建,然后,$< 指代前置文件(src/%.txt), $@ 指代目标文件(dest/%.txt)。</p>
<h3 id="38-判断和循环">3.8 判断和循环</h3>
<p>Makefile使用 Bash 语法,完成判断和循环。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
ifeq <span class="o">(</span><span class="si">$(</span>CC<span class="si">)</span>,gcc<span class="o">)</span>
<span class="nv">libs</span><span class="o">=</span><span class="si">$(</span>libs_for_gcc<span class="si">)</span>
<span class="k">else
</span><span class="nv">libs</span><span class="o">=</span><span class="si">$(</span>normal_libs<span class="si">)</span>
endif
</code></pre></div></div>
<p>上面代码判断当前编译器是否 gcc ,然后指定不同的库文件。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
LIST <span class="o">=</span> one two three
all:
<span class="k">for </span>i <span class="k">in</span> <span class="si">$(</span>LIST<span class="si">)</span><span class="p">;</span> <span class="k">do</span> <span class="se">\</span>
<span class="nb">echo</span> <span class="nv">$$</span>i<span class="p">;</span> <span class="se">\</span>
<span class="k">done</span>
<span class="c"># 等同于</span>
all:
<span class="k">for </span>i <span class="k">in </span>one two three<span class="p">;</span> <span class="k">do</span> <span class="se">\</span>
<span class="nb">echo</span> <span class="nv">$i</span><span class="p">;</span> <span class="se">\</span>
<span class="k">done</span>
</code></pre></div></div>
<p>上面代码的运行结果。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
one
two
three
</code></pre></div></div>
<h3 id="39-函数">3.9 函数</h3>
<p>Makefile 还可以使用函数,格式如下。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="si">$(</span><span class="k">function </span>arguments<span class="si">)</span>
<span class="c"># 或者</span>
<span class="k">${</span><span class="nv">function</span><span class="p"> arguments</span><span class="k">}</span>
</code></pre></div></div>
<p>Makefile提供了许多<a href="https://www.gnu.org/software/make/manual/html_node/Functions.html">内置函数</a>,可供调用。下面是几个常用的内置函数。</p>
<p><strong>(1)shell 函数</strong></p>
<p>shell 函数用来执行 shell 命令</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
srcfiles :<span class="o">=</span> <span class="si">$(</span>shell <span class="nb">echo </span>src/<span class="o">{</span>00..99<span class="o">}</span>.txt<span class="si">)</span>
</code></pre></div></div>
<p><strong>(2)wildcard 函数</strong></p>
<p>wildcard 函数用来在 Makefile 中,替换 Bash 的通配符。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
srcfiles :<span class="o">=</span> <span class="si">$(</span>wildcard src/<span class="k">*</span>.txt<span class="si">)</span>
</code></pre></div></div>
<p><strong>(3)subst 函数</strong></p>
<p>subst 函数用来文本替换,格式如下。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="si">$(</span>subst from,to,text<span class="si">)</span>
</code></pre></div></div>
<p>下面的例子将字符串”feet on the street”替换成”fEEt on the strEEt”。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="si">$(</span>subst ee,EE,feet on the street<span class="si">)</span>
</code></pre></div></div>
<p>下面是一个稍微复杂的例子。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
comma:<span class="o">=</span> ,
empty:<span class="o">=</span>
<span class="c"># space变量用两个空变量作为标识符,当中是一个空格</span>
space:<span class="o">=</span> <span class="si">$(</span>empty<span class="si">)</span> <span class="si">$(</span>empty<span class="si">)</span>
foo:<span class="o">=</span> a b c
bar:<span class="o">=</span> <span class="si">$(</span>subst <span class="si">$(</span>space<span class="si">)</span>,<span class="si">$(</span>comma<span class="si">)</span>,<span class="si">$(</span>foo<span class="si">))</span>
<span class="c"># bar is now `a,b,c'.</span>
</code></pre></div></div>
<p><strong>(4)patsubst函数</strong></p>
<p>patsubst 函数用于模式匹配的替换,格式如下。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="si">$(</span>patsubst pattern,replacement,text<span class="si">)</span>
</code></pre></div></div>
<p>下面的例子将文件名”x.c.c bar.c”,替换成”x.c.o bar.o”。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="si">$(</span>patsubst %.c,%.o,x.c.c bar.c<span class="si">)</span>
</code></pre></div></div>
<p><strong>(5)替换后缀名</strong></p>
<p>替换后缀名函数的写法是:变量名 + 冒号 + 后缀名替换规则。它实际上patsubst函数的一种简写形式。</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
min: <span class="si">$(</span>OUTPUT:.js<span class="o">=</span>.min.js<span class="si">)</span>
</code></pre></div></div>
<p>上面代码的意思是,将变量OUTPUT中的后缀名 .js 全部替换成 .min.js 。</p>
<h2 id="四makefile-的实例">四、Makefile 的实例</h2>
<p><strong>(1)执行多个目标</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
<span class="nb">rm </span>program
cleanobj :
<span class="nb">rm</span> <span class="k">*</span>.o
cleandiff :
<span class="nb">rm</span> <span class="k">*</span>.diff
</code></pre></div></div>
<p>上面代码可以调用不同目标,删除不同后缀名的文件,也可以调用一个目标(cleanall),删除所有指定类型的文件。</p>
<p><strong>(2)编译C语言项目</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
edit : main.o kbd.o command.o display.o
cc <span class="nt">-o</span> edit main.o kbd.o command.o display.o
main.o : main.c defs.h
cc <span class="nt">-c</span> main.c
kbd.o : kbd.c defs.h command.h
cc <span class="nt">-c</span> kbd.c
command.o : command.c defs.h command.h
cc <span class="nt">-c</span> command.c
display.o : display.c defs.h
cc <span class="nt">-c</span> display.c
clean :
<span class="nb">rm </span>edit main.o kbd.o command.o display.o
.PHONY: edit clean
</code></pre></div></div>
<p>今天,Make命令的介绍就到这里。下一篇文章我会介绍,<a href="https://www.ruanyifeng.com/blog/2015/03/build-website-with-make.html">如何用 Make 来构建 Node.js 项目</a>。</p>
<p>(完)</p>https://www.ruanyifeng.com/blog/2015/02/make.html✔curl命令2022-12-09T00:00:00+00:002022-12-09T00:00:00+00:00https://thredreams.github.io/2022/12/09/%E2%9C%94curl%E5%91%BD%E4%BB%A4<p>https://zhuanlan.zhihu.com/p/106019177</p>
<h2 id="curl常用命令">curl常用命令</h2>
<p>curl 是一个利用URL语法在命令行下工作的文件传输工具。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称 curl 为下载工具。其语法格式及常见参数含义如下,</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 语法</span>
curl <span class="o">[</span>option] <span class="o">[</span>url]
<span class="c"># 最简单的使用,获取服务器内容,默认将输出打印到标准输出中(STDOUT)中。</span>
curl http://www.centos.org
<span class="c"># 添加-v参数可以看到详细解析过程,通常用于debug</span>
curl <span class="nt">-v</span> http://www.centos.org
<span class="c"># curl发送Get请求</span>
curl URL
curl URL <span class="nt">-O</span> 文件绝对路径
<span class="c"># curl发送post请求</span>
<span class="c"># 请求主体用json格式</span>
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/json'</span> <span class="nt">-d</span> @json文件绝对路径 URL
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/json'</span> <span class="nt">-d</span> <span class="s1">'json内容'</span> URL
<span class="c"># 请求主体用xml格式</span>
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/xml'</span> <span class="nt">-d</span> @xml文件绝对路径 URL
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/xml'</span> <span class="nt">-d</span> <span class="s1">'xml内容'</span> URL
<span class="c"># 设置cookies</span>
curl URL <span class="nt">--cookie</span> <span class="s2">"cookie内容"</span>
curl URL <span class="nt">--cookie-jar</span> cookie文件绝对路径
<span class="c"># 设置代理字符串</span>
curl URL <span class="nt">--user-agent</span> <span class="s2">"代理内容"</span>
curl URL <span class="nt">-A</span> <span class="s2">"代理内容"</span>
<span class="c"># curl限制带宽</span>
curl URL <span class="nt">--limit-rate</span> 速度
<span class="c"># curl认证</span>
curl <span class="nt">-u</span> user:pwd URL
curl <span class="nt">-u</span> user URL
<span class="c"># 只打印http头部信息</span>
curl <span class="nt">-I</span> URL
curl <span class="nt">-head</span> URL
<span class="c"># 末尾参数</span>
<span class="nt">--progress</span> 显示进度条
<span class="nt">--silent</span> 不现实进度条
<span class="c"># 不需要修改/etc/hosts,curl直接解析ip请求域名</span>
<span class="c"># 将 http://example.com 或 https://example.com 请求指定域名解析的IP为127.0.0.1</span>
curl <span class="nt">--resolve</span> example.com:80:127.0.0.1 http://example.com/
curl <span class="nt">--resolve</span> example.com:443:127.0.0.1 https://example.com/
</code></pre></div></div>
<h2 id="curl接口测试">curl接口测试</h2>
<p>curl 可以很方便地完成对 REST API 的调用场景,比如:设置 Header,指定 HTTP 请求方法,指定 HTTP 消息体,指定权限认证信息等。通过 -v 选项也能输出 REST 请求的所有返回信息。curl 功能很强大,有很多参数,这里列出 REST 测试常用的参数:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-X</span>/--request <span class="o">[</span>GET|POST|PUT|DELETE|…] 指定请求的 HTTP 方法
<span class="nt">-H</span>/--header 指定请求的 HTTP Header
<span class="nt">-d</span>/--data 指定请求的 HTTP 消息体(Body)
<span class="nt">-v</span>/--verbose 输出详细的返回信息
<span class="nt">-u</span>/--user 指定账号、密码
<span class="nt">-b</span>/--cookie 读取 cookie
<span class="c"># 典型的测试命令为:</span>
curl <span class="nt">-v</span> <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> http://127.0.0.1:8080/user <span class="nt">-d</span><span class="s1">'{"username":"admin","password":"admin1234"}'</span>...
<span class="c"># 测试get请求</span>
curl http://www.linuxidc.com/login.cgi?user<span class="o">=</span>test001&password<span class="o">=</span>123456
<span class="c"># 测试post请求</span>
curl <span class="nt">-d</span> <span class="s2">"user=nickwolfe&password=12345"</span> http://www.linuxidc.com/login.cgi
<span class="c"># 请求主体用json格式</span>
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/json'</span> <span class="nt">-d</span> @json文件绝对路径 URL
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/json'</span> <span class="nt">-d</span> <span class="s1">'json内容'</span> URL
<span class="c"># 请求主体用xml格式</span>
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/xml'</span> <span class="nt">-d</span> @xml文件绝对路径 URL
curl <span class="nt">-X</span> POST <span class="nt">-H</span> <span class="s1">'content-type: application/xml'</span> <span class="nt">-d</span> <span class="s1">'xml内容'</span> URL
<span class="c"># 发送post请求时需要使用-X选项,除了使用POST外,还可以使用http规范定义的其它请求谓词,如PUT,DELETE等</span>
curl <span class="nt">-XPOST</span> url
<span class="c">#发送post请求时,通常需要指定请求体数据。可以使用-d或--data来指定发送的请求体。</span>
curl <span class="nt">-XPOST</span> <span class="nt">-d</span> <span class="s2">"name=leo&age=12"</span> url
<span class="c"># 如果需要对请求数据进行urlencode,可以使用下面的方式:</span>
curl <span class="nt">-XPOST</span> <span class="nt">--data-urlencode</span> <span class="s2">"name=leo&age=12"</span> url
<span class="c"># 此外发送post请求还可以有如下几种子选项:</span>
–data-raw
–data-ascii
–data-binary
</code></pre></div></div>
<blockquote>
<p>使用curl和Jenkins REST API</p>
</blockquote>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># To retrieve the job config.xml</span>
curl <span class="nt">-X</span> GET <span class="s1">'<jenkinshost>/job/<jobname>/config.xml'</span> <span class="nt">-u</span> username:API_TOKEN <span class="nt">-o</span> <jobname>.xml
<span class="c"># to use this config to create a new job</span>
curl <span class="nt">-s</span> <span class="nt">-XPOST</span> <span class="s1">'<jenkinshost>/createItem?name=<jobname>'</span> <span class="nt">-u</span> username:API_TOKEN <span class="nt">--data-binary</span> @<jobname>.xml <span class="nt">-H</span> <span class="s2">"Content-Type:text/xml"</span>
<span class="c"># get all jenkins jobs</span>
curl <span class="nt">-X</span> GET <span class="s1">'<jenkinshost>/api/json?pretty=true'</span> <span class="nt">-u</span> username:API_TOKEN <span class="nt">-o</span> jobs.json
<span class="c"># get jenkins view</span>
curl <span class="nt">-X</span> GET <span class="s1">'<jenkinshost>/view/<viewname>/api/json'</span> <span class="nt">-u</span> username:API_TOKEN <span class="nt">-o</span> view.json
</code></pre></div></div>
<h2 id="curl-help">curl help</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">--help</span>
Usage: curl <span class="o">[</span>options...] <url>
Options: <span class="o">(</span>H<span class="o">)</span> means HTTP/HTTPS only, <span class="o">(</span>F<span class="o">)</span> means FTP only
<span class="nt">--anyauth</span> Pick <span class="s2">"any"</span> authentication method <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-a</span>, <span class="nt">--append</span> Append to target file when uploading <span class="o">(</span>F/SFTP<span class="o">)</span>
<span class="nt">--basic</span> Use HTTP Basic Authentication <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--cacert</span> FILE CA certificate to verify peer against <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--capath</span> DIR CA directory to verify peer against <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">-E</span>, <span class="nt">--cert</span> CERT[:PASSWD] Client certificate file and password <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--cert-status</span> Verify the status of the server certificate <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--cert-type</span> TYPE Certificate file <span class="nb">type</span> <span class="o">(</span>DER/PEM/ENG<span class="o">)</span> <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--ciphers</span> LIST SSL ciphers to use <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--compressed</span> Request compressed response <span class="o">(</span>using deflate or <span class="nb">gzip</span><span class="o">)</span>
<span class="nt">-K</span>, <span class="nt">--config</span> FILE Read config from FILE
<span class="nt">--connect-timeout</span> SECONDS Maximum <span class="nb">time </span>allowed <span class="k">for </span>connection
<span class="nt">--connect-to</span> HOST1:PORT1:HOST2:PORT2 Connect to host <span class="o">(</span>network level<span class="o">)</span>
<span class="nt">-C</span>, <span class="nt">--continue-at</span> OFFSET Resumed transfer OFFSET
<span class="nt">-b</span>, <span class="nt">--cookie</span> STRING/FILE Read cookies from STRING/FILE <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-c</span>, <span class="nt">--cookie-jar</span> FILE Write cookies to FILE after operation <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--create-dirs</span> Create necessary <span class="nb">local </span>directory hierarchy
<span class="nt">--crlf</span> Convert LF to CRLF <span class="k">in </span>upload
<span class="nt">--crlfile</span> FILE Get a CRL list <span class="k">in </span>PEM format from the given file
<span class="nt">-d</span>, <span class="nt">--data</span> DATA HTTP POST data <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--data-raw</span> DATA HTTP POST data, <span class="s1">'@'</span> allowed <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--data-ascii</span> DATA HTTP POST ASCII data <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--data-binary</span> DATA HTTP POST binary data <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--data-urlencode</span> DATA HTTP POST data url encoded <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--delegation</span> STRING GSS-API delegation permission
<span class="nt">--digest</span> Use HTTP Digest Authentication <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--disable-eprt</span> Inhibit using EPRT or LPRT <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--disable-epsv</span> Inhibit using EPSV <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--dns-servers</span> DNS server addrs to use: 1.1.1.1<span class="p">;</span>2.2.2.2
<span class="nt">--dns-interface</span> Interface to use <span class="k">for </span>DNS requests
<span class="nt">--dns-ipv4-addr</span> IPv4 address to use <span class="k">for </span>DNS requests, dot notation
<span class="nt">--dns-ipv6-addr</span> IPv6 address to use <span class="k">for </span>DNS requests, dot notation
<span class="nt">-D</span>, <span class="nt">--dump-header</span> FILE Write the received headers to FILE
<span class="nt">--egd-file</span> FILE EGD socket path <span class="k">for </span>random data <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--engine</span> ENGINE Crypto engine <span class="o">(</span>use <span class="s2">"--engine list"</span> <span class="k">for </span>list<span class="o">)</span> <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--expect100-timeout</span> SECONDS How long to <span class="nb">wait </span><span class="k">for </span>100-continue <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-f</span>, <span class="nt">--fail</span> Fail silently <span class="o">(</span>no output at all<span class="o">)</span> on HTTP errors <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--fail-early</span> Fail on first transfer error, <span class="k">do </span>not <span class="k">continue</span>
<span class="nt">--false-start</span> Enable TLS False Start.
<span class="nt">-F</span>, <span class="nt">--form</span> CONTENT Specify HTTP multipart POST data <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--form-string</span> STRING Specify HTTP multipart POST data <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--ftp-account</span> DATA Account data string <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-alternative-to-user</span> COMMAND String to replace <span class="s2">"USER [name]"</span> <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-create-dirs</span> Create the remote <span class="nb">dirs </span><span class="k">if </span>not present <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-method</span> <span class="o">[</span>MULTICWD/NOCWD/SINGLECWD] Control CWD usage <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-pasv</span> Use PASV/EPSV instead of PORT <span class="o">(</span>F<span class="o">)</span>
<span class="nt">-P</span>, <span class="nt">--ftp-port</span> ADR Use PORT with given address instead of PASV <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-skip-pasv-ip</span> Skip the IP address <span class="k">for </span>PASV <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-pret</span> Send PRET before PASV <span class="o">(</span><span class="k">for </span>drftpd<span class="o">)</span> <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-ssl-ccc</span> Send CCC after authenticating <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-ssl-ccc-mode</span> ACTIVE/PASSIVE Set CCC mode <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--ftp-ssl-control</span> Require SSL/TLS <span class="k">for </span>FTP login, clear <span class="k">for </span>transfer <span class="o">(</span>F<span class="o">)</span>
<span class="nt">-G</span>, <span class="nt">--get</span> Send the <span class="nt">-d</span> data with a HTTP GET <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-g</span>, <span class="nt">--globoff</span> Disable URL sequences and ranges using <span class="o">{}</span> and <span class="o">[]</span>
<span class="nt">-H</span>, <span class="nt">--header</span> LINE Pass custom header LINE to server <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-I</span>, <span class="nt">--head</span> Show document info only
<span class="nt">-h</span>, <span class="nt">--help</span> This <span class="nb">help </span>text
<span class="nt">--hostpubmd5</span> MD5 Hex-encoded MD5 string of the host public key. <span class="o">(</span>SSH<span class="o">)</span>
<span class="nt">-0</span>, <span class="nt">--http1</span>.0 Use HTTP 1.0 <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--http1</span>.1 Use HTTP 1.1 <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--http2</span> Use HTTP 2 <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--http2-prior-knowledge</span> Use HTTP 2 without HTTP/1.1 Upgrade <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--ignore-content-length</span> Ignore the HTTP Content-Length header
<span class="nt">-i</span>, <span class="nt">--include</span> Include protocol headers <span class="k">in </span>the output <span class="o">(</span>H/F<span class="o">)</span>
<span class="nt">-k</span>, <span class="nt">--insecure</span> Allow connections to SSL sites without certs <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--interface</span> INTERFACE Use network INTERFACE <span class="o">(</span>or address<span class="o">)</span>
<span class="nt">-4</span>, <span class="nt">--ipv4</span> Resolve name to IPv4 address
<span class="nt">-6</span>, <span class="nt">--ipv6</span> Resolve name to IPv6 address
<span class="nt">-j</span>, <span class="nt">--junk-session-cookies</span> Ignore session cookies <span class="nb">read </span>from file <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--keepalive-time</span> SECONDS Wait SECONDS between keepalive probes
<span class="nt">--key</span> KEY Private key file name <span class="o">(</span>SSL/SSH<span class="o">)</span>
<span class="nt">--key-type</span> TYPE Private key file <span class="nb">type</span> <span class="o">(</span>DER/PEM/ENG<span class="o">)</span> <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--krb</span> LEVEL Enable Kerberos with security LEVEL <span class="o">(</span>F<span class="o">)</span>
<span class="nt">--libcurl</span> FILE Dump libcurl equivalent code of this <span class="nb">command </span>line
<span class="nt">--limit-rate</span> RATE Limit transfer speed to RATE
<span class="nt">-l</span>, <span class="nt">--list-only</span> List only mode <span class="o">(</span>F/POP3<span class="o">)</span>
<span class="nt">--local-port</span> RANGE Force use of RANGE <span class="k">for </span><span class="nb">local </span>port numbers
<span class="nt">-L</span>, <span class="nt">--location</span> Follow redirects <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--location-trusted</span> Like <span class="s1">'--location'</span>, and send auth to other hosts <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--login-options</span> OPTIONS Server login options <span class="o">(</span>IMAP, POP3, SMTP<span class="o">)</span>
<span class="nt">-M</span>, <span class="nt">--manual</span> Display the full manual
<span class="nt">--mail-from</span> FROM Mail from this address <span class="o">(</span>SMTP<span class="o">)</span>
<span class="nt">--mail-rcpt</span> TO Mail to this/these addresses <span class="o">(</span>SMTP<span class="o">)</span>
<span class="nt">--mail-auth</span> AUTH Originator address of the original email <span class="o">(</span>SMTP<span class="o">)</span>
<span class="nt">--max-filesize</span> BYTES Maximum file size to download <span class="o">(</span>H/F<span class="o">)</span>
<span class="nt">--max-redirs</span> NUM Maximum number of redirects allowed <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-m</span>, <span class="nt">--max-time</span> SECONDS Maximum <span class="nb">time </span>allowed <span class="k">for </span>the transfer
<span class="nt">--metalink</span> Process given URLs as metalink XML file
<span class="nt">--negotiate</span> Use HTTP Negotiate <span class="o">(</span>SPNEGO<span class="o">)</span> authentication <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-n</span>, <span class="nt">--netrc</span> Must <span class="nb">read</span> .netrc <span class="k">for </span>user name and password
<span class="nt">--netrc-optional</span> Use either .netrc or URL<span class="p">;</span> overrides <span class="nt">-n</span>
<span class="nt">--netrc-file</span> FILE Specify FILE <span class="k">for </span>netrc
-:, <span class="nt">--next</span> Allows the following URL to use a separate <span class="nb">set </span>of options
<span class="nt">--no-alpn</span> Disable the ALPN TLS extension <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-N</span>, <span class="nt">--no-buffer</span> Disable buffering of the output stream
<span class="nt">--no-keepalive</span> Disable keepalive use on the connection
<span class="nt">--no-npn</span> Disable the NPN TLS extension <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--no-sessionid</span> Disable SSL session-ID reusing <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--noproxy</span> List of hosts which <span class="k">do </span>not use proxy
<span class="nt">--ntlm</span> Use HTTP NTLM authentication <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--ntlm-wb</span> Use HTTP NTLM authentication with winbind <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--oauth2-bearer</span> TOKEN OAuth 2 Bearer Token <span class="o">(</span>IMAP, POP3, SMTP<span class="o">)</span>
<span class="nt">-o</span>, <span class="nt">--output</span> FILE Write to FILE instead of stdout
<span class="nt">--pass</span> PASS Pass phrase <span class="k">for </span>the private key <span class="o">(</span>SSL/SSH<span class="o">)</span>
<span class="nt">--path-as-is</span> Do not squash .. sequences <span class="k">in </span>URL path
<span class="nt">--pinnedpubkey</span> FILE/HASHES Public key to verify peer against <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--post301</span> Do not switch to GET after following a 301 redirect <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--post302</span> Do not switch to GET after following a 302 redirect <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--post303</span> Do not switch to GET after following a 303 redirect <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--preproxy</span> <span class="o">[</span>PROTOCOL://]HOST[:PORT] Proxy before HTTP<span class="o">(</span>S<span class="o">)</span> proxy
-#, <span class="nt">--progress-bar</span> Display transfer progress as a progress bar
<span class="nt">--proto</span> PROTOCOLS Enable/disable PROTOCOLS
<span class="nt">--proto-default</span> PROTOCOL Use PROTOCOL <span class="k">for </span>any URL missing a scheme
<span class="nt">--proto-redir</span> PROTOCOLS Enable/disable PROTOCOLS on redirect
<span class="nt">-x</span>, <span class="nt">--proxy</span> <span class="o">[</span>PROTOCOL://]HOST[:PORT] Use proxy on given port
<span class="nt">--proxy-anyauth</span> Pick <span class="s2">"any"</span> proxy authentication method <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-basic</span> Use Basic authentication on the proxy <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-digest</span> Use Digest authentication on the proxy <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-cacert</span> FILE CA certificate to verify peer against <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-capath</span> DIR CA directory to verify peer against <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-cert</span> CERT[:PASSWD] Client certificate file and password <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-cert-type</span> TYPE Certificate file <span class="nb">type</span> <span class="o">(</span>DER/PEM/ENG<span class="o">)</span> <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-ciphers</span> LIST SSL ciphers to use <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-crlfile</span> FILE Get a CRL list <span class="k">in </span>PEM format from the given file <span class="k">for </span>proxy
<span class="nt">--proxy-insecure</span> Allow connections to SSL sites without certs <span class="k">for </span>proxy <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-key</span> KEY Private key file name <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-key-type</span> TYPE Private key file <span class="nb">type </span><span class="k">for </span>proxy <span class="o">(</span>DER/PEM/ENG<span class="o">)</span> <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-negotiate</span> Use HTTP Negotiate <span class="o">(</span>SPNEGO<span class="o">)</span> authentication on the proxy <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-ntlm</span> Use NTLM authentication on the proxy <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-header</span> LINE Pass custom header LINE to proxy <span class="o">(</span>H<span class="o">)</span>
<span class="nt">--proxy-pass</span> PASS Pass phrase <span class="k">for </span>the private key <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-ssl-allow-beast</span> Allow security flaw to improve interop <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-tlsv1</span> Use TLSv1 <span class="k">for </span>proxy <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--proxy-tlsuser</span> USER TLS username <span class="k">for </span>proxy
<span class="nt">--proxy-tlspassword</span> STRING TLS password <span class="k">for </span>proxy
<span class="nt">--proxy-tlsauthtype</span> STRING TLS authentication <span class="nb">type </span><span class="k">for </span>proxy <span class="o">(</span>default SRP<span class="o">)</span>
<span class="nt">--proxy-service-name</span> NAME SPNEGO proxy service name
<span class="nt">--service-name</span> NAME SPNEGO service name
<span class="nt">-U</span>, <span class="nt">--proxy-user</span> USER[:PASSWORD] Proxy user and password
<span class="nt">--proxy1</span>.0 HOST[:PORT] Use HTTP/1.0 proxy on given port
<span class="nt">-p</span>, <span class="nt">--proxytunnel</span> Operate through a HTTP proxy tunnel <span class="o">(</span>using CONNECT<span class="o">)</span>
<span class="nt">--pubkey</span> KEY Public key file name <span class="o">(</span>SSH<span class="o">)</span>
<span class="nt">-Q</span>, <span class="nt">--quote</span> CMD Send <span class="nb">command</span><span class="o">(</span>s<span class="o">)</span> to server before transfer <span class="o">(</span>F/SFTP<span class="o">)</span>
<span class="nt">--random-file</span> FILE File <span class="k">for </span>reading random data from <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">-r</span>, <span class="nt">--range</span> RANGE Retrieve only the bytes within RANGE
<span class="nt">--raw</span> Do HTTP <span class="s2">"raw"</span><span class="p">;</span> no transfer decoding <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-e</span>, <span class="nt">--referer</span> Referer URL <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-J</span>, <span class="nt">--remote-header-name</span> Use the header-provided filename <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-O</span>, <span class="nt">--remote-name</span> Write output to a file named as the remote file
<span class="nt">--remote-name-all</span> Use the remote file name <span class="k">for </span>all URLs
<span class="nt">-R</span>, <span class="nt">--remote-time</span> Set the remote file<span class="s1">'s time on the local output
-X, --request COMMAND Specify request command to use
--resolve HOST:PORT:ADDRESS Force resolve of HOST:PORT to ADDRESS
--retry NUM Retry request NUM times if transient problems occur
--retry-connrefused Retry on connection refused (use with --retry)
--retry-delay SECONDS Wait SECONDS between retries
--retry-max-time SECONDS Retry only within this period
--sasl-ir Enable initial response in SASL authentication
-S, --show-error Show error. With -s, make curl show errors when they occur
-s, --silent Silent mode (don'</span>t output anything<span class="o">)</span>
<span class="nt">--socks4</span> HOST[:PORT] SOCKS4 proxy on given host + port
<span class="nt">--socks4a</span> HOST[:PORT] SOCKS4a proxy on given host + port
<span class="nt">--socks5</span> HOST[:PORT] SOCKS5 proxy on given host + port
<span class="nt">--socks5-hostname</span> HOST[:PORT] SOCKS5 proxy, pass host name to proxy
<span class="nt">--socks5-gssapi-service</span> NAME SOCKS5 proxy service name <span class="k">for </span>GSS-API
<span class="nt">--socks5-gssapi-nec</span> Compatibility with NEC SOCKS5 server
<span class="nt">-Y</span>, <span class="nt">--speed-limit</span> RATE Stop transfers below RATE <span class="k">for</span> <span class="s1">'speed-time'</span> secs
<span class="nt">-y</span>, <span class="nt">--speed-time</span> SECONDS Trigger <span class="s1">'speed-limit'</span> abort after SECONDS <span class="o">(</span>default: 30<span class="o">)</span>
<span class="nt">--ssl</span> Try SSL/TLS <span class="o">(</span>FTP, IMAP, POP3, SMTP<span class="o">)</span>
<span class="nt">--ssl-reqd</span> Require SSL/TLS <span class="o">(</span>FTP, IMAP, POP3, SMTP<span class="o">)</span>
<span class="nt">-2</span>, <span class="nt">--sslv2</span> Use SSLv2 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">-3</span>, <span class="nt">--sslv3</span> Use SSLv3 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--ssl-allow-beast</span> Allow security flaw to improve interop <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--ssl-no-revoke</span> Disable cert revocation checks <span class="o">(</span>WinSSL<span class="o">)</span>
<span class="nt">--stderr</span> FILE Where to redirect stderr <span class="o">(</span>use <span class="s2">"-"</span> <span class="k">for </span>stdout<span class="o">)</span>
<span class="nt">--suppress-connect-headers</span> Suppress proxy CONNECT response headers
<span class="nt">--tcp-nodelay</span> Use the TCP_NODELAY option
<span class="nt">--tcp-fastopen</span> Use TCP Fast Open
<span class="nt">-t</span>, <span class="nt">--telnet-option</span> <span class="nv">OPT</span><span class="o">=</span>VAL Set telnet option
<span class="nt">--tftp-blksize</span> VALUE Set TFTP BLKSIZE option <span class="o">(</span>must be <span class="o">></span>512<span class="o">)</span>
<span class="nt">--tftp-no-options</span> Do not send TFTP options requests
<span class="nt">-z</span>, <span class="nt">--time-cond</span> TIME Transfer based on a <span class="nb">time </span>condition
<span class="nt">-1</span>, <span class="nt">--tlsv1</span> Use <span class="o">>=</span> TLSv1 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--tlsv1</span>.0 Use TLSv1.0 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--tlsv1</span>.1 Use TLSv1.1 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--tlsv1</span>.2 Use TLSv1.2 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--tlsv1</span>.3 Use TLSv1.3 <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--tls-max</span> VERSION Use TLS up to VERSION <span class="o">(</span>SSL<span class="o">)</span>
<span class="nt">--trace</span> FILE Write a debug trace to FILE
<span class="nt">--trace-ascii</span> FILE Like <span class="nt">--trace</span>, but without hex output
<span class="nt">--trace-time</span> Add <span class="nb">time </span>stamps to trace/verbose output
<span class="nt">--tr-encoding</span> Request compressed transfer encoding <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-T</span>, <span class="nt">--upload-file</span> FILE Transfer FILE to destination
<span class="nt">--url</span> URL URL to work with
<span class="nt">-B</span>, <span class="nt">--use-ascii</span> Use ASCII/text transfer
<span class="nt">-u</span>, <span class="nt">--user</span> USER[:PASSWORD] Server user and password
<span class="nt">--tlsuser</span> USER TLS username
<span class="nt">--tlspassword</span> STRING TLS password
<span class="nt">--tlsauthtype</span> STRING TLS authentication <span class="nb">type</span> <span class="o">(</span>default: SRP<span class="o">)</span>
<span class="nt">--unix-socket</span> PATH Connect through this Unix domain socket
<span class="nt">--abstract-unix-socket</span> PATH Connect to an abstract Unix domain socket
<span class="nt">-A</span>, <span class="nt">--user-agent</span> STRING Send User-Agent STRING to server <span class="o">(</span>H<span class="o">)</span>
<span class="nt">-v</span>, <span class="nt">--verbose</span> Make the operation more talkative
<span class="nt">-V</span>, <span class="nt">--version</span> Show version number and quit
<span class="nt">-w</span>, <span class="nt">--write-out</span> FORMAT Use output FORMAT after completion
<span class="nt">--xattr</span> Store metadata <span class="k">in </span>extended file attributes
<span class="nt">-q</span>, <span class="nt">--disable</span> Disable .curlrc <span class="o">(</span>must be first parameter<span class="o">)</span>
</code></pre></div></div>
<h2 id="curl练习">curl练习</h2>
<p><img src="https://pic2.zhimg.com/v2-d3511c14d09203b19ab2773ee3899e21_r.jpg" alt="" /></p>
<p><a href="https://linux.cn/article-11648-1.html">21 个 curl 命令练习</a></p>
<p><a href="https://jvns.ca/blog/2019/08/27/curl-exercises/">curl exercises</a></p>
<p><a href="http://blog.lujun9972.win/blog/2019/09/11/curl%E7%BB%83%E4%B9%A0/">curl练习答案</a></p>
<h2 id="参考文章">参考文章</h2>
<p><a href="https://curl.haxx.se/docs/manpage.html">curl the man page</a></p>
<p><a href="https://blog.csdn.net/russ44/article/details/53308838">linux使用curl进行接口测试</a></p>
<p><a href="https://www.cnblogs.com/52fhy/p/6581116.html">cURL笔记</a></p>https://zhuanlan.zhihu.com/p/106019177 curl常用命令❌tts项目2022-12-09T00:00:00+00:002022-12-09T00:00:00+00:00https://thredreams.github.io/2022/12/09/%E2%9D%8CTTS%E9%A1%B9%E7%9B%AE<h3 id="service在后台被kill">service在后台被kill</h3>service在后台被kill❌常用压缩命令2022-12-09T00:00:00+00:002022-12-09T00:00:00+00:00https://thredreams.github.io/2022/12/09/%E2%9D%8C%E5%B8%B8%E7%94%A8%E5%8E%8B%E7%BC%A9%E5%91%BD%E4%BB%A4<p><strong>tar</strong> -zxvf <strong>tar</strong>.<strong>gz</strong>.</p>tar -zxvf tar.gz.⭕sed完全教程2022-12-09T00:00:00+00:002022-12-09T00:00:00+00:00https://thredreams.github.io/2022/12/09/%E2%AD%95sed%E5%AE%8C%E5%85%A8%E6%95%99%E7%A8%8B<p>https://zhuanlan.zhihu.com/p/145661854</p>
<h2 id="sed是什么">sed是什么</h2>
<p>sed是一个流编辑器!什么是流编辑器?将文件或标准输入的内容作为编辑的对象,对其按照需求进行修改。</p>
<p>pattern space是什么?在流编辑中有pattern space的概念,翻译为:模式空间。简单理解就是一个缓冲区,sed从输入流中一行一行的取出内容放到这个缓冲区中按照SCRIPT(脚本)进行处理。</p>
<h2 id="sed的总体结构">sed的总体结构</h2>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sed</span> <span class="o">[</span>OPTION]... <span class="o">{</span>script-only-if-no-other-script<span class="o">}</span> <span class="o">[</span>input-file]...
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">[OPTION]...</code>
为一系列可选的sed命令选项,省略号代表可以为一个或多个。
下面列举出几个常用的选项,全部的选项可以在man文档中查看。</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-n</span>
<span class="nt">--quiet</span>
<span class="nt">--silent</span>
</code></pre></div></div>
<p>默认情况下在对模式空间中内容进行处理完之后打印到屏幕然后取下一行进行处理。如果加了这些选项,在处理后只有在SCRIPT(脚本)中明确指定了p的时候才会输出当前模式空间的内容。</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-e</span> SCRIPT
<span class="nt">--expression</span><span class="o">=</span>SCRIPT
</code></pre></div></div>
<p>添加sed commands(sed命令)到sed SCRIPT(脚本)中。为什么说是添加?因为可以多次用该选项,添加多个命令。脚本的语法下面将会详细讲解,当脚本中包含空格时需要将脚本应单引号包含。</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-f</span> SCRIPT-FILE
<span class="nt">--file</span><span class="o">=</span>SCRIPT-FILE
</code></pre></div></div>
<p>将文件中的内容作为脚本,添加到当前脚本中,可以与<code class="language-plaintext highlighter-rouge">-e</code>共存。文件中脚本的语法与-e后的脚本语法一致。</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-i</span><span class="o">[</span>SUFFIX]
<span class="nt">--in-place</span><span class="o">[=</span>SUFFIX]
</code></pre></div></div>
<p>默认对模式空间中的内容进行修改不会影响原文件的内容,如果添加该选项表示就地编辑,会直接改动原文件内容。其中SUFFIX(后缀)是可选的,如果设置了的话,在改动原文件之前会将其以SUFFIX为文件名后缀备份一份。例如<code class="language-plaintext highlighter-rouge">-i".bak" sample.txt</code>会在处理前将<code class="language-plaintext highlighter-rouge">sample.txt</code>备份为<code class="language-plaintext highlighter-rouge">sample.txt.bak</code> 。</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">--follow-symlinks</span>
</code></pre></div></div>
<p>在使用<code class="language-plaintext highlighter-rouge">-i</code>选项进行就地修改的时候,如果处理的文件名为一个符号链接,如果不加该选项链接到的实际文件将无法实现就地修改。</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-E</span>
<span class="nt">-r</span>
<span class="nt">--regexp-extended</span>
</code></pre></div></div>
<p>使用扩展正则(ERE),默认使用基础正则。关于正则这一篇就够了:<a href="http://deerchao.net/tutorials/regex/regex.htm">http://deerchao.net/tutorials/regex/regex.htm</a></p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">-s</span>
<span class="nt">--separate</span>
</code></pre></div></div>
<p>当输入为多个文件时默认将其合并为一个流,使用该选项可以将其分开单独处理。</p>
<p><code class="language-plaintext highlighter-rouge">{script-only-if-no-other-script}</code></p>
<p>当-e, –expression, -f, or –file这些选项都没有指定时,在该位置(也就是在可识别的命令选项后,输入文件前的位置)的内容被作为sed SCRIPT(脚本)。</p>
<p><code class="language-plaintext highlighter-rouge">[input-file]...</code></p>
<p>要处理的文本,可以为文件、标准输入、管道传入的文本(其实也是标准输入)。</p>
<h2 id="sed-script脚本">sed SCRIPT(脚本)</h2>
<p>sed SCRIPT是sed的核心,SCRIPT由一系列的sed commands(sed命令)组成,使用-e,-f等选项将一系列的sed命令添加到脚本当中。在循环处理的过程中,对模式空间的内容使用脚本进行处理作为结果。</p>
<h3 id="commandssed命令">commands(sed命令)</h3>
<p>sed命令语法:</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>addr]X[options]
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">addr</code>是一个可选的能否标识行的地址,可以是一个单独的方号、正则、行范围。</p>
<ul>
<li>单独一个数字标识行号。</li>
<li>3,5表示3-5行。</li>
<li>/^#define/ 表示以#define开头的行。</li>
<li>/X$/ 表示以X结尾的行。</li>
<li>
<p>$表示最后一行。
<code class="language-plaintext highlighter-rouge">X[options]</code>是一个动作及其选项,该动作只对addr能够匹配的行进行处理,可选值有以下:</p>
</li>
<li>a :新增, [options]为要增加的内容,新增的内容为单独一行,在当前行的下方,如果需要增加多行,行与行之间使用<code class="language-plaintext highlighter-rouge">\n</code>分割。</li>
<li>c :取代, [options]为新的内容。</li>
<li>i :插入, [options]为要插入的内容,插入的内容为单独一行,在当前行的上方,同样可以使用<code class="language-plaintext highlighter-rouge">\n</code>实现插入多行。</li>
<li>d :删除, 不需要[options]。</li>
<li>p :列印,不需要[options],将当前模式空间的内容打印出来,通常与参数 sed -n配合使用。</li>
<li>s :取代,最复杂的一个命令,[options]为正则表达式/REGEXP/REPLACEMENT/[FLAGS],例如:<code class="language-plaintext highlighter-rouge">s/old/new/g</code>表示将old换为new,g表示进行全局替换,默认为替换第一处。<code class="language-plaintext highlighter-rouge">/old/new/g</code>为s的option。</li>
<li>REGEXP</li>
<li>正则表达式,匹配的内容会被REPLACEMENT替换。</li>
<li>REPLACEMENT</li>
<li>字符串,直接替换</li>
<li>\N N可以为1~9, 引用匹配分组的内容。<br />
<code class="language-plaintext highlighter-rouge">sed -e 's/#\(Port.+\)/\1/g' /etc/ssh/sshd_config</code><br />
<code class="language-plaintext highlighter-rouge">sed -r -e 's/#(Port.+)/\1/g' /etc/ssh/sshd_config</code><br />
上面的两行等价将以#PORT开始的行#去掉,使用-r选项能够避免使用()</li>
<li>& 引用整个匹配内容<br />
<code class="language-plaintext highlighter-rouge">sed -e s/^Port/#&/g /etc/ssh/sshd_config</code><br />
匹配以Port开头的行,并在前面加上#。</li>
<li>\L 将后面的内容转为小写,直到遇到\U或\E结束</li>
<li>\l 将后面的一个字符转为小写</li>
<li>\U 将后面的内容转为大写,直到遇到\L或\E结束</li>
<li>\u 将后面的一个字符转为大写</li>
<li>
<p>\E 结束\L,\U的转换<br />
<code class="language-plaintext highlighter-rouge">sed -r -e 's/(\b[^\s])/\u\1/g' /etc/ssh/sshd_config</code><br />
将所有单词首字母大写。</p>
</li>
<li>
<p>FLAGS</p>
</li>
<li>g 全局替换</li>
<li>p 打印</li>
<li>
<p>= 打印行号</p>
</li>
<li>
<p>y :转换,[options]为转换字典/src/dst/,将出现的每个src中的字符替换为dst中相应的字符,<code class="language-plaintext highlighter-rouge">y/abc#/ABC%/</code>a->A,b->B,c->C,#->%</p>
</li>
<li>q :退出,[options]为返回值,退出后直接结束输入流的处理。</li>
</ul>
<p>多个命令可以使用;进行分割,但是a,c,i这三个后面无法使用;再接其它命令,这也就是说如果使用多个命令这三个必须放在最后,例如:<code class="language-plaintext highlighter-rouge">/^abc/p;a newline</code>将abc开始的行打印,并在其后添加一行。</p>
<h2 id="实例">实例</h2>
<p>如果你已经完全掌握了上面的内容,下面的实例已经不需要看了,实例可以千变万化但是万变不离其中。当然如果你理解上面的讲解有困难可以结合实例再回到上面去看!</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 打印1-3行</span>
<span class="nb">sed</span> <span class="nt">-n</span> <span class="nt">-e</span> <span class="s1">'1,3p'</span> sample.txt
<span class="c"># 删除1-3行</span>
<span class="nb">sed</span> <span class="nt">-n</span> <span class="nt">-e</span> <span class="s1">'1,3d'</span> sample.txt
<span class="c"># 打印出abc开始的行</span>
<span class="nb">sed</span> <span class="nt">-n</span> <span class="nt">-e</span> <span class="s1">'/^abc/p;a newline'</span> sample.txt
<span class="c"># 在所有行前加#</span>
<span class="nb">sed</span> <span class="nt">-e</span> <span class="s1">'s/^/#/g'</span> sample.txt
<span class="c"># 在所有非#开头的行加#</span>
<span class="nb">sed</span> <span class="nt">-e</span> <span class="s1">'s/^[^#]/#/g'</span> sed_sample.txt
<span class="c"># 将所有字母大写</span>
<span class="nb">sed</span> <span class="nt">-r</span> <span class="nt">-e</span> <span class="s1">'s/(.*)/\U\1/g'</span> /etc/ssh/sshd_config
<span class="c"># 将所有单词首字母大写</span>
<span class="nb">sed</span> <span class="nt">-r</span> <span class="nt">-e</span> <span class="s1">'s/(\b[^\s])/\u\1/g'</span> /etc/ssh/sshd_config
<span class="c"># 删除所有#开头的行</span>
<span class="nb">sed</span> <span class="nt">-r</span> <span class="nt">-e</span> <span class="s1">'/^#/d'</span> /etc/ssh/sshd_config
<span class="c"># 将sshd_config中的#PasswordAuthentication yes去除注释,并将yes改为no</span>
<span class="nb">sed</span> <span class="nt">-n</span> <span class="nt">-r</span> <span class="nt">-e</span> <span class="s1">'s/^.{0,1}(PasswordAuthentication ).{2,3}$/\1no/gp'</span> /etc/ssh/sshd_config
<span class="c"># 就地修改</span>
<span class="nb">sed</span> <span class="nt">-i</span> <span class="nt">-r</span> <span class="nt">-e</span> <span class="s1">'s/^.{0,1}(PasswordAuthentication ).{2,3}$/\1no/g'</span> /etc/ssh/sshd_config
</code></pre></div></div>
<h2 id="最后">最后</h2>
<p>还有哪些没有提到?</p>
<p>commands(sed命令)还有很多,具体参看<code class="language-plaintext highlighter-rouge">info sed</code>,有了本文的基础再看info就so easy了。</p>
<p>总结:要想真正的掌握某个工具的使用必须先从结构上认识这个工具,了解工具的原理,照葫芦画瓢的方法来学习会把你累死的,学了在实际中你也很难直接用。</p>https://zhuanlan.zhihu.com/p/145661854 sed是什么