主动跳转的下载地址,用 curl 下载怎么保留原文件名?
最近在写 Jenkinsfile
的时候遇到了一个场景,须要从一条链接地址下载 jar
包,jar 包名字是带版本号的,我是心愿不扭转原来文件名的状况上来下载到某个目录下。
一开始感觉这个场景需要不难哦,首先想到的是用我比拟熟的 curl
命令间接下载就应该就能够了,马上动工!
第一次失败
咱们这次要下载的链接长这样(用 log4j-api
的仓库地址举例):
https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST
先用浏览器关上一下链接,看看能不能失常下载:
没有问题,而且主动下载了最新版本的 jar 包,名字叫 log4j-api-2.14.1.jar
,完满的很,当初马上转战 curl 命令。
$ curl -O https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST
这个大写的 -O
参数示意不须要指定文件名,用链接的文件名字来作为文件名。
一个回车上来,问题来了:
呈现了很多奇奇怪怪的货色,而且下载下来的文件名变成了 'redirect?r=central-proxy'
。
咱们来 cat
一下这个文件看看外面有什么线索:
原来是返回了一个 400 - Bad Request
的页面,看来是咱们的地址有点问题,咱们一起来认真看看这条地址,其实能够看到地址前面有好几个参数:
r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST
能够看到外面带了个 &
符号,这个符号在 Linux 里是指后盾运行,所以咱们的地址还不能间接用。
知识点一:
这里能够有两种办法解决问题:
- 本义 url,将
&
前减少反斜杠\&
。- 用
curl -d
参数来传参,并且强制应用GET
办法-G
。# 办法一:本义 url $ curl -O https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy\&g=org.apache.logging.log4j\&a=log4j-api\&v=LATEST # 办法二:用 curl -d 参数 $ curl -O -G \ https://repository.sonatype.org/service/local/artifact/maven/redirect \ -d "r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST"
小插播:
欢送关注我的 VX 号:
叨叨技术 (daodao_tech)
前沿技术,深度评测
原创文章,首发公众
第二次失败
通过下面两个办法咱们又下载了一个货色:
从截图能够看到,咱们下载下来的文件名还是不太对,叫做 'redirect?r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST'
,并不是咱们想要的 log4j-api-2.14.1.jar
。
咱们持续 cat
一下它:
这次文件外面的内容不一样了,外面返回了一段话:
If you are not automatically redirected use this url: https://repository.sonatype.org/service/local/repositories/central-proxy/content/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar
芜湖,起码服务器正确返回了咱们想要的下载地址,然而为什么咱们还是下载不到呢?
知识点二:
从内容能够猜想,服务器其实是想重定向到外面真正的下载地址让咱们下载,咱们能够通过参数
curl -i
来打印HTTP
的头来看看:
从截图能够看到,服务器返回了 HTTP 307
的状态码,而且 Header
外面有 location
的参数,所以证实了咱们的想法,那怎么让 curl
去主动重定向到服务器返回的地址呢?
知识点三:
这里咱们能够通过用
curl -L
参数来解决问题,-L
参数示意Follow redirects
,就是说通知 curl 主动重定向到新的链接。
第三次失败
感觉要解决这个问题了!咱们马上试下:
$ curl -O -L https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy\&g=org.apache.logging.log4j\&a=log4j-api\&v=LATEST
啊哈,如同胜利下载到货色了!从截图能够看到它下载了 293k
的货色,跟咱们从浏览器下载的大小一样。
然而!为啥文件名还是不对呢,并不是咱们想要的 log4j-api-2.14.1.jar
。
知识点四:
尽管咱们用了
curl -L
参数实现了主动重定向到下载链接,然而curl -O
参数只会用到最开始的地址作为下载的文件名。
第四次尝试
既然不能间接 curl -O
,那有没有方法先拿到真正的下载地址,再用 curl -O
去申请地址,那不是能够保留原文件名下载了吗?
先上命令代码:
$ curl -I -L -s https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy\&g=org.apache.logging.log4j\&a=log4j-api\&v=LATEST \
-o /dev/null \
-w %{url_effective}
知识点五:
这个命令外面有很多知识点要介绍下:
curl -I
参数示意只打印信息,不会真正下载curl -s
(小写)参数示意静默模式curl -o /dev/null
(小写)示意将输入的货色重定向到/dev/null
抛弃curl -w %{url_effective}
(小写)示意输入最初的url
地址
所以通过下面的命令,咱们可能获取到最初的下载地址了:
第五次胜利
既然咱们都获取到真正的下载地址了,那么咱们拿着这个地址再用 curl -O
就能够达到咱们想要的成果了。
立即上代码:
$ curl -I -L -s https://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy\&g=org.apache.logging.log4j\&a=log4j-api\&v=LATEST \
-o /dev/null \
-w %{url_effective} \
| xargs curl -O
终于胜利!咱们再优化一下下面的命令,能够失去最初咱们要的命令代码:
$ curl -GILs https://repository.sonatype.org/service/local/artifact/maven/redirect \
-d "r=central-proxy&g=org.apache.logging.log4j&a=log4j-api&v=LATEST" \
-o /dev/null \
-w %{url_effective} \
| xargs curl -O
最初
欢送关注我的 VX 号: 叨叨技术 (daodao_tech)
前沿技术,深度评测
原创文章,首发公众