【问题标题】:Get the latest download link programmatically以编程方式获取最新的下载链接
【发布时间】:2020-09-03 23:03:39
【问题描述】:

我希望能够使用我的 bash 脚本自动下载最新版本的软件。不幸的是,没有一个网站像 github 那样拥有最新的发布链接。 就我而言,我需要下载最新的 stable 版本的 Nginx

目前我用这个 http://nginx.org/download/nginx-1.4.7.tar.gz 然后我从源代码编译

问题是我需要不时手动检查更新并更新链接。

有什么方法可以让我的脚本自动获取最新的稳定版 Nginx

P.S 不能通过 yum 安装

【问题讨论】:

  • 我建议你做任何必要的事情来通知新的稳定版本并继续手动下载/编译。我知道这并不能回答您的问题,但我认为这是合理的建议。

标签: bash


【解决方案1】:

更新
通过http://nginx.org/en/download.htmlhttp://nginx.org/download/,在下面的原始解决方案中使用,不区分稳定版本和主线版本)确定并下载最新 stable 版本的解决方案 - 有效在 Linux 和 OSX 上:

# Determine the latest stable version's download URL, assumed to be 
# the first `/download/nginx-*.tar.gz`-like link following the header 
# "Stable version".
latestVer=$(curl -s 'http://nginx.org/en/download.html' | 
   sed 's/</\'$'\n''</g' | sed -n '/>Stable version$/,$ p' | 
   egrep -m1 -o '/download/nginx-.+\.tar\.gz')

# Download.
curl "http://nginx.org${latestVer}" > nginx-latest.tar.gz

注意:这依赖于页面 http://nginx.org/en/download.html 的 HTML 结构的细节,这不是最可靠的解决方案。


原始解决方案通过http://nginx.org/download/确定最新版本,其中不区分稳定版本和主线版本:

Linux 上,尝试:

 # Determine latest version:
 latestVer=$(curl 'http://nginx.org/download/' | 
   grep -oP 'href="nginx-\K[0-9]+\.[0-9]+\.[0-9]+' | 
   sort -t. -rn -k1,1 -k2,2 -k3,3 | head -1)

 # Download latest version:
 curl "http://nginx.org/download/nginx-${latestVer}.tar.gz" > nginx-latest.tar.gz

这不依赖于http://nginx.org/download/ 的特定列表顺序;相反,会提取版本号并进行适当的排序。


OSX 上 - grep 不支持 -P\K 无法删除匹配的左侧部分,请尝试:

# Determine latest version:
latestVer=$(curl 'http://nginx.org/download/' | 
 egrep -o 'href="nginx-[0-9]+\.[0-9]+\.[0-9]+' | sed 's/^href="nginx-//' |
 sort -t. -rn -k1,1 -k2,2 -k3,3 | head -1)

# Download latest version:
curl "http://nginx.org/download/nginx-${latestVer}.tar.gz" > nginx-latest.tar.gz

【讨论】:

    【解决方案2】:

    这将确定最新的稳定版本:

    $ lynx -dump http://nginx.org/en/download.html \
        | awk '/Stable/{t=1}t&&/nginx-/{$0=$2;sub(/.+\]/,"");print;exit}'
    nginx-1.4.7
    

    使用这个结果来组装一个正确的下载 URL 并使用wget/curl 进行下载。

    这将确定最新版本的下载 URL:

    $ lynx -dump http://nginx.org/download/ | awk '/nginx-.*\.zip$/{url=$2}END{print url}'
    http://nginx.org/download/nginx-1.5.9.zip
    

    这依赖于他们的网络服务器按日期对目录列表进行排序(目前这样做)。

    【讨论】:

    • 看起来 gr8 以及另一个它需要 lynx 但你确定它会获取最新的稳定版本而不是主线
    • @user2650277 你说得对,我在你的问题中忽略了这个细节。我已经相应地更新了我的帖子。
    • 希望我能同时接受你和@mklement0 的回答。因为他提供了一个在不使用第三方工具的情况下在 linux 和 osx 上都可以工作的解决方案,所以他应该被接受:)但是你的也很棒
    • 哦,我什至不知道 OSX 附带 curl。不用担心:-)
    • +1 表示简洁;先决条件是lynx 的可用性,大多数平台默认不安装。
    【解决方案3】:

    如果可以使用第三方工具,下面是另一个使用多平台网络抓取 CLI xidel 的选项:

    curl "http://nginx.org$( \
       xidel 'http://nginx.org/en/download.html' \
         -e '(//a[matches(@href, "/download/nginx-.+\.tar\.gz$")])[2]/@href' \
       )" -O
    

    该命令使用 XPath 表达式来提取感兴趣的 URL;这里假设页面上的2nd /download/nginx-*.tar.gz 链接是stable 版本(第一个代表主线版本)。

    这不是最可靠的方法,但这是抓取并非为程序化消费而设计的网页的固有问题。

    【讨论】:

      【解决方案4】:

      https://drupal.stackexchange.com/a/23701找到它

      wget http://lftp.yar.ru/ftp/$(wget -O- http://lftp.yar.ru/ftp/ | egrep -o 'lftp-[0-9\.]+.tar.gz' | sort -V  | tail -1)
      

      可能是一个更简单的解决方案

      【讨论】:

        【解决方案5】:

        获取最新的nginx和naxsi版本,不需要排序但需要jq

        latestNginx=$(curl -s http://hg.nginx.org/nginx/tags |
          grep "^ *release-" | head -1 | cut -c 9-)
        latestNaxsi=$(curl -s https://api.github.com/repos/nbs-system/naxsi/releases |
          jq -r .[].tag_name | grep -v rc | head -1)
        

        【讨论】:

          【解决方案6】:

          这是获取和下载最新稳定版 nginx 的另一个简短解决方案:

          这是在 Linux 环境中测试的,可能无法在 MacOS 上运行

          Stable替换为Mainline以获得最新的主线版本

          curl "http://nginx.org$(curl -s http://nginx.org/en/download.html | grep -oP 'Stable version.*?\K(/download/.*?tar.gz)')" --output nginx-stable.tar.gz
          

          【讨论】:

            【解决方案7】:

            能够使用相同的方法编写脚本下载最新的当前/稳定节点版本,没有任何特殊要求。

            下载最新的 LTS 节点版本:

            latestLTSNode=$(curl -s https://nodejs.org/en/download/ | grep -E "Latest LTS Version: <strong>[[:digit:]]+.[[:digit:]]+.[[:digit:]]+"|grep -oE "[[:digit:]]+.[[:digit:]]+.[[:digit:]]+"| head -n1) ; nodejs_url="https://nodejs.org/dist/v${latestLTSNode}/node-v${latestLTSNode}-linux-x64.tar.xz"; wget ${nodejs_url} ; filename=$(basename $nodejs_url); filefolder=$(echo $filename | sed 's|.tar.xz||g') ;
            

            下载最新的当前节点版本:

            latestCurrentNode=$(curl -s https://nodejs.org/en/download/current/ | grep -E "Latest Current Version: <strong>[[:digit:]]+.[[:digit:]]+.[[:digit:]]+"|grep -oE "[[:digit:]]+.[[:digit:]]+.[[:digit:]]+"| head -n1) ; nodejs_url="https://nodejs.org/dist/v${latestCurrentNode}/node-v${latestCurrentNode}-linux-x64.tar.xz"; wget ${nodejs_url} ; filename=$(basename $nodejs_url); filefolder=$(echo $filename | sed 's|.tar.xz||g') ;
            

            【讨论】:

              猜你喜欢
              • 2011-02-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多