如何从命令行给定存储库下载包?

如何从命令行给定存储库下载包?

它不是关于常见的下载和安装,apt(aptitude 等)的作用,它是一个脚本化的下载一个包文件。

我找到了执行dget此任务的工具,效果非常好。但是,不幸的是,它没有任何选项来指定不同的存储库 URL,如/etc/apt/sources.list.

这有可能吗?实际上,dget类似的功能是最好的,我还可以在其中指定存储库 URL。


Ps 非常感谢您的脚本,但我更喜欢使用 debian 工具来完成此任务非常 简单的任务。它将成为构建脚本的一部分,供外部使用,并且任何不必要的复杂性会带来难以忍受的附带成本。它必须由 debian 工具完成。

PS2。最后,我通过更新系统范围的存储库并使用dget.非常感谢您的脚本!

答案1

我能找到的所有工具都使用本地apt信息(以及/etc/apt/sources.list上次apt-get update运行时定义的存储库等)。解释起来并不太困难存储库格式尽管。

节省

#!/bin/sh
# Downloads a package from a repository
# dlpkg repo distro suite arch package

for arch in all "${4}"; do
    curl "${1}/dists/${2}/${3}/binary-${arch}/Packages.xz" | xz -d | "$(dirname $0)/pkgfilename" -v "PACKAGE=${5}" | while read filename; do
        curl -O "${1}/${filename}"
    done
done

作为dlpkg, 和

#!/usr/bin/awk -f

/Package:/ {
    package = $2
}

package == PACKAGE && /Filename:/ {
    print $2
}

as pkgfilename,使它们可执行,然后您可以通过运行下载包

./dlpkg <repository URL> <distribution> <suite> <architecture> <package>

例如

./dlpkg http://ftp.fr.debian.org/debian unstable main amd64 libc6

如果您需要处理Packages文件不按规范顺序(Packagebefore Filename)的存储库,您可以使用以下 AWK 脚本:

#!/usr/bin/awk -f

BEGIN {
    filename = ""
}

/^$/ {
    filename = ""
    stanza = 0
}

/Package:/ {
    if ($2 == PACKAGE) {
        stanza = 1
        if (filename != "") {
            print filename
            stanza = 0
        }
    }
}

/Filename:/ {
    filename = $2
    if (stanza == 1) {
        print filename
        filename = ""
    }
}

没有错误处理,留给读者作为练习。也没有签名验证...

答案2

如果您正在使用 apt 运行 Debian 或其他发行版的最新版本,则可以使用apt-get它。将以下设置放入名为的文件中apt-get.conf使其不使用

Dir::Etc::main ".";
Dir::Etc::Parts "./apt.conf.d";
Dir::Etc::sourcelist "./sources.list";
Dir::Etc::sourceparts "./sources.list.d";
Dir::State "./apt-tmp";
Dir::State::status "./apt-tmp/status";
Dir::Cache "./apt-tmp";

准备一些必要的文件:

mkdir -p apt-tmp/lists/partial
touch apt-tmp/status
apt-get -c apt.conf update >/dev/null

然后你可以使用以下命令将包下载到当前目录

apt-get -c apt.conf download $packages

apt-get对于缺少该命令的旧版本download,您可以使用

apt-get -c apt.conf install -d $packages

将包及其依赖项下载到apt-tmp/archives.

答案3

我认为您想要实现的目标与拥有回购协议的想法不符。这个想法是,您必须将存储库添加到 repolist,然后从中安装,等等。

可以手动下载软件包(我经常使用 Fedora 的 RPM 软件包执行此操作),并使用常规工具手动安装软件包(在我的例子中dnf)。

我通常使用来自的 URL /etc/yum.repos.d/<repo>.repo,然后只需使用浏览器浏览,然后使用wget.它应该与 DEB 包类似。

所以,

  1. 使用浏览器手动下载软件包或wget
  2. 从 cli 使用包管理客户端进行安装。

如果存储库可以直接在线获取(我不明白为什么不可以),那么dnf当给它一个 RPM 包的 URL 时就会理解。我确信等效的 Debian 工具也会做同样的事情。因此,您无需使用浏览器或wget.

据我了解,你只对下载包裹。所以在这种情况下,我认为使用 plainwget是最好的方法,等等。

答案4

好吧,也许这个脚本是满足您需求的解决方案:

#!/bin/bash

U=1美元
文件=“$2”

[[ -z "$U" ]] && echo -e "用法:$0 repo-url [要下载的文件]\n如果没有给出\"要下载的文件\",此脚本将列出存储库中的文件\n";

for i in $(curl -l "$U" 2>/dev/null|grep -i 'href='|sed -e 's/.*href=//g' -e 's/>.*/ /g' -e 's/"//g'|grep -v '/$'|grep "$FILE")
 如果 [[ -z "$FILE" ]]
 然后
  回显“文件:$i”
 别的
  echo "下载文件:$i"
  curl -q "${U}/${i}" --output "$i" 2>/dev/null
  ls -la“$i”
完毕

相关内容