コマンドラインから特定のリポジトリのパッケージをダウンロードするには?

コマンドラインから特定のリポジトリのパッケージをダウンロードするには?

一般的なダウンロードとインストール、apt(適性など)の機能に関するものではなく、スクリプトされたものです。ダウンロードパッケージファイル。

dgetこれを行うツールを見つけましたが、本当にうまくいきます。しかし残念ながら/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

最新バージョンのDebianまたは他のディストリビューションを実行するためにaptを使用している場合はそれを使用できますapt-getapt-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

私はあなたが達成したいものがリポジトリを持つアイデアと一致しないと思います。アイデアは、リポジトリを追加してからリポジトリからインストールする必要があることです。

パッケージは手動でダウンロードできます(私はしばしばFedoraのRPMパッケージを使用してこれを行います)、通常のツール(私の場合)を使用して手動でインストールdnfできます。

私は通常のURLを使用し/etc/yum.repos.d/<repo>.repoてブラウザに移動し、wgetDEBパッケージに似ている必要があります。

だから、

  1. ブラウザを使用して手動でパッケージをダウンロードするか、wget
  2. CLIからパッケージ管理クライアントを使用してインストールします。

リポジトリをオンラインで直接使用できる場合(そうでない理由はわかりません)、dnfRPMパッケージにURLを提供すると意味があります。私は同等のDebianツールが同じことをすることを確信しています。したがって、ブラウザやwget

私が理解する限り、あなたは正しいですダウンロードパック。だから、この場合はプレーンを使用するのがwget最善の方法だと思います。

答え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")
する
 if [[ -z "$FILE" ]]
 それから
  echo "ファイル: $i"
 その他
  echo "ファイルのダウンロード: $i"
  curl -q "${U}/${i}" --output "$i" 2>/dev/null
  ls -la "$i"
 フィリピン諸島
完璧

関連情報