它不是关于常见的下载和安装,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
文件不按规范顺序(Package
before 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 包类似。
所以,
- 使用浏览器手动下载软件包或
wget
- 从 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” 菲 完毕