乐趣区

关于jenkins:自动跳转的下载地址用-curl-下载怎样保留原文件名

主动跳转的下载地址,用 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}

知识点五:
这个命令外面有很多知识点要介绍下:

  1. curl -I 参数示意只打印信息,不会真正下载
  2. curl -s(小写)参数示意静默模式
  3. curl -o /dev/null(小写)示意将输入的货色重定向到 /dev/null 抛弃
  4. 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)

前沿技术,深度评测

原创文章,首发公众

退出移动版