我已经写了一个shell脚本来下载和安装tomcat服务器v(8.5.31). wget http://www.us.apache.org/dist/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz它工作得很好,但是当版本被更改为9.0.10时,它开始给出错误404 not found.所以我应该怎么做才能总是得到最新的版本呢?
wget http://www.us.apache.org/dist/tomcat/tomcat-8/v8.5.31/bin/apache-tomcat-8.5.31.tar.gz
9.0.10
xpcnnkqh1#
TL;DR
TOMCAT_VER=`curl --silent http://mirror.vorboss.net/apache/tomcat/tomcat-8/ | grep v8 | awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'` wget -N http://mirror.vorboss.net/apache/tomcat/tomcat-8/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz
我遇到了同样的挑战。但是,对于我的解决方案,我需要最新的8. 5. x Tomcat版本,该版本不断变化。由于下载Tomcat的URL保持不变,只是版本发生了变化,因此我发现以下解决方案对我很有效:
TOMCAT_VER=`curl --silent http://mirror.vorboss.net/apache/tomcat/tomcat-8/ | grep v8 | awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'` echo Tomcat version: $TOMCAT_VER Tomcat version: 8.5.40
grep v8-返回包含所需版本的行:
grep v8
<img src="/icons/folder.gif" alt="[DIR]"> <a href="v8.5.40/">v8.5.40/</a> 2019-04-12 13:16 -
awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'-提取所需的版本:
awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'
8.5.40
然后我继续使用解压缩后的版本下载Tomcat:
wget -N http://mirror.vorboss.net/apache/tomcat/tomcat-8/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz
下面是完整的curl响应,使用curl、grep和awk从该响应中提取版本:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html> <head> <title>Index of /apache/tomcat/tomcat-8</title> </head> <body> <h1>Index of /apache/tomcat/tomcat-8</h1> <pre><img src="/icons/blank.gif" alt="Icon "> <a href="?C=N;O=D">Name</a> <a href="?C=M;O=A">Last modified</a> <a href="?C=S;O=A">Size</a> <a href="?C=D;O=A">Description</a><hr><img src="/icons/back.gif" alt="[PARENTDIR]"> <a href="/apache/tomcat/">Parent Directory</a> - <img src="/icons/folder.gif" alt="[DIR]"> <a href="v8.5.40/">v8.5.40/</a> 2019-04-12 13:16 - <hr></pre> <address>Apache/2.4.25 (Debian) Server at mirror.vorboss.net Port 80</address> </body></html>
epfja78i2#
我已经找到了一种使用github镜像的方法。基本上,你必须查询github api中所有可用的标签。然后,对于每个标签,必须确定日期。最后,日期最晚的标签就是最新的标签!试试这个脚本--我们称它为latest-tag。它依赖于jq。它需要一小段时间来执行,但应该会打印出最新标签的tarball的URL(当前为:(x、x、e、f、x)
latest-tag
jq
#!/bin/bash # Prints the url to the latest tag of given github repo # $1: repo (e.g.: apache/tomcat ) # $2: optional github credentials. Credentials are needed if running into the api rate limit (e.g.: <user>|<user>:<authkey>) repo=${1:?Missing parameter: repo (e.g.: apache/tomcat )} [ -n "$2" ] && credentials="-u $2" declare -a commits declare -a tarball_urls while IFS=, read commit_url tarball_url do date=$(curl $credentials --silent "$commit_url" | jq -r ".commit.author.date") if [[ "$date" > ${latest_date:- } ]] then latest_date=$date latest_tarball_url=$tarball_url fi done < <( curl $credentials --silent "https://api.github.com/repos/$repo/tags" | jq -r ".[] | [.commit.url, .tarball_url] | @csv" | tr -d \") echo $latest_tarball_url
用法:
./latest-tag apache/tomcat
您可能会受到github api的速率限制的影响,因此,您可能需要为脚本提供github凭证:
./latest-tag apache/tomcat <username>
这将要求您输入github密码。为了以交互方式运行它,您可以为脚本提供一个个人的github api token:
./latest-tag apache/tomcat <username>:<api token>
kq4fsx7k3#
免责声明-此解决方案使用屏幕抓取
查找并下载适用于Linux或Windows-x64的Apache Tomcat 9的最新版本。
import os import urllib.request url_ends_with = ".tar.gz\"" # Use line for Non-Windows url_ends_with = "windows-x64.zip\"" # Use line for Windows-x64 url_starts_with = "\"http" dir_to_contain_download = "tmp/" tomcat_apache_org_frontpage_html = "tomcat.apache.org.frontpage.html" download_page = "https://tomcat.apache.org/download-90.cgi" try: if not os.path.exists(dir_to_contain_download): os.makedirs(dir_to_contain_download, exist_ok=True) htmlfile = urllib.request.urlretrieve(download_page, dir_to_contain_download + tomcat_apache_org_frontpage_html) fp = open(dir_to_contain_download + tomcat_apache_org_frontpage_html) line = fp.readline() cnt = 1 while line: line = fp.readline() cnt += 1 if url_ends_with in line and url_starts_with in line: tomcat_url_index = line.find(url_ends_with) tomcat_url = line[line.find(url_starts_with) + 1 : tomcat_url_index + len(url_ends_with) - 1] print ("Downloading: " + tomcat_url) print ("To file: " + dir_to_contain_download + tomcat_url[tomcat_url.rfind("/")+1:]) zipfile = urllib.request.urlretrieve(tomcat_url, dir_to_contain_download + tomcat_url[tomcat_url.rfind("/")+1:]) break finally: fp.close() os.remove(dir_to_contain_download + "/" + tomcat_apache_org_frontpage_html)
8fsztsew4#
由于我没有足够的声誉来回答乔纳森或编辑他的帖子,下面是我的解决方案(在版本8-10中测试):
#!/bin/bash wantedVer=9 TOMCAT_VER=`curl --silent http://mirror.vorboss.net/apache/tomcat/tomcat-${wantedVer}/|grep -oP "(?<=\"v)${wantedVer}(?:\.\d+){2}\b"|sort -V|tail -n 1` wget -N https://mirror.vorboss.net/apache/tomcat/tomcat-${TOMCAT_VER%.*.*}/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz # Apache download link: wget -N https://dlcdn.apache.org/tomcat/tomcat-${TOMCAT_VER%.*.*}/v${TOMCAT_VER}/bin/apache-tomcat-${TOMCAT_VER}.tar.gz
我遇到了Jonathans代码的问题,因为同时有不同的版本可下载,这破坏了组合下载链接。在这个解决方案中,只考虑最新的版本。改变第一行就足以区分不同的主版本。代码说明:curl获取所需tomcat版本的apache目录列表。然后,Grep使用(-P)Perl正则表达式模式并仅保留匹配部分(-o),提取具有 positive lookbehind 的所有不同版本。结果:每行包含一个版本号,没有特定顺序。这些行按版本(sort -V)排序,只有最后一行(tail -n 1)(所有版本中最大的版本所在的行)被分配给变量TOMCAT_VER。最后,使用收集到的版本信息创建下载链接,并通过wget下载,但前提是下载的版本比当前版本更新(-N)。
curl
Grep
sort -V
tail -n 1
wget
s3fp2yjn5#
我写了这段代码:
TOMCAT_URL=$(curl -sS https://tomcat.apache.org/download-90.cgi | grep \ '>tar.gz</a>' | head -1 | grep -E -o 'https://[a-z0-9:./-]+.tar.gz') TOMCAT_NAME=$(echo $TOMCAT_URL | grep -E -o 'apache-tomcat-[0-9.]+[0-9]')
这可能不是最有效的方法,但是很容易理解它是如何工作的,而且它确实工作了。如果你想要那个版本,请将download-XX.cgi链接更新为10。然后你可以做:
curl -sS $TOMCAT_URL | tar xfz - ln -s $TOMCAT_NAME apache-tomcat
并且您将在apache-tomcat上拥有Tomcat的当前版本。当新版本出来时,您可以使用它来进行简单的更新,同时保留旧版本。
5条答案
按热度按时间xpcnnkqh1#
TL;DR
我遇到了同样的挑战。但是,对于我的解决方案,我需要最新的8. 5. x Tomcat版本,该版本不断变化。
由于下载Tomcat的URL保持不变,只是版本发生了变化,因此我发现以下解决方案对我很有效:
grep v8
-返回包含所需版本的行:awk '{split($5,c,">v") ; split(c[2],d,"/") ; print d[1]}'
-提取所需的版本:然后我继续使用解压缩后的版本下载Tomcat:
下面是完整的curl响应,使用curl、grep和awk从该响应中提取版本:
epfja78i2#
我已经找到了一种使用github镜像的方法。基本上,你必须查询github api中所有可用的标签。然后,对于每个标签,必须确定日期。最后,日期最晚的标签就是最新的标签!
试试这个脚本--我们称它为
latest-tag
。它依赖于jq
。它需要一小段时间来执行,但应该会打印出最新标签的tarball的URL(当前为:(x、x、e、f、x)用法:
您可能会受到github api的速率限制的影响,因此,您可能需要为脚本提供github凭证:
这将要求您输入github密码。为了以交互方式运行它,您可以为脚本提供一个个人的github api token:
kq4fsx7k3#
免责声明-此解决方案使用屏幕抓取
查找并下载适用于Linux或Windows-x64的Apache Tomcat 9的最新版本。
8fsztsew4#
由于我没有足够的声誉来回答乔纳森或编辑他的帖子,下面是我的解决方案(在版本8-10中测试):
我遇到了Jonathans代码的问题,因为同时有不同的版本可下载,这破坏了组合下载链接。在这个解决方案中,只考虑最新的版本。
改变第一行就足以区分不同的主版本。
代码说明:
curl
获取所需tomcat版本的apache目录列表。然后,
Grep
使用(-P)Perl正则表达式模式并仅保留匹配部分(-o),提取具有 positive lookbehind 的所有不同版本。结果:每行包含一个版本号,没有特定顺序。
这些行按版本(
sort -V
)排序,只有最后一行(tail -n 1
)(所有版本中最大的版本所在的行)被分配给变量TOMCAT_VER。最后,使用收集到的版本信息创建下载链接,并通过
wget
下载,但前提是下载的版本比当前版本更新(-N)。s3fp2yjn5#
我写了这段代码:
这可能不是最有效的方法,但是很容易理解它是如何工作的,而且它确实工作了。如果你想要那个版本,请将download-XX.cgi链接更新为10。
然后你可以做:
并且您将在apache-tomcat上拥有Tomcat的当前版本。当新版本出来时,您可以使用它来进行简单的更新,同时保留旧版本。