apt-getでダウンロードする前にコマンドを実行する方法は?


8

apt-getがパッケージのダウンロードを開始する前にコマンドを実行するにはどうすればよいですか?

dpkgのpre-invokeフック(スクリプトをapt-getにフックする)については知っていますが、ダウンロード後に実行されるようです。

$ apt-get update
Get: 11 http://security.debian.org/ wheezy/updates/main qemu amd64 1.1.2+dfsg-6a+deb7u7 [115 kB]
Fetched 70.9 MB in 10s (6,776 kB/s)
refreshing freenet index
--2015-05-19 15:55:25--  http://127.0.0.1:8888/freenet:USK@oRy7ltZLJM-w-kcOBdiZS1pAA8P-BxZ3BPiiqkmfk0E,6a1KFG6S-Bwp6E-MplW52iH~Y3La6GigQVQDeMjI6rg,AQACAAE/deb.mempo.org/-42/

ダウンロードのにコマンドを実行する必要があります。より正確には、スクリプトはapt-getを呼び出した後、apt-getがオンラインリソースにアクセスする前に実行する必要があります。

プレダウンロードフックのようなものはありますか?

スクリプトapt-getを置き換えることなく(そして更新によって元に戻される可能性のある他のことを行わずに)インストールを実行できることが重要です。


2
apt-getそれ自体が本物を呼び出すという名前の関数を宣言することができapt-getます。あなたはそれを持っているしたい範囲に応じて、機能はのいずれかで宣言することができた/etc/profileか、~/.profileまたは~/.bashrc
user43791

「スクリプトはapt-getを呼び出した後、apt-getがオンラインリソースにアクセスする前に実行する必要がある」とはどういう意味ですか?フックが適切に実行されるためには、プロダクションapt-getのどの部分を実行する必要がありますか?
jthill '20年

@jthill他のURLにアクセスする前に、特定のURLのダウンロードをトリガーする必要があります。その理由は、freenet(debリポジトリとして使用される分散型の匿名データストア)からダウンロードし、何かをダウンロードする前に、最新バージョンの1つの積極的な検索をトリガーしたいためです。
Arne Babenhauserheide、2015年

コメントから、あなたはシステムコマンドをバイパスすることができず、システムのインストーラーによっても削除できないようにシステムコマンドを置き換える方法を求めています。システムをルートキット化する方法を尋ねています。
2015年

ユースケースを説明していただければ助かります。言い換えれば、何をしようとしているのですか?
Faheem Mitha、2015年

回答:


5

apt pre / post-invokeフックの使用についてはどうですか?

本質的にはdpkgのpre / post-invokeフックに似ていますが、aptのフックです(これは実際に使用シナリオで重要なものと想定しています)。AFAIKには他にもありますが、私はこのようにしか使用していません。

例えば

$ sudo cat /etc/apt/apt.conf.d/05new-hook
APT::Update::Pre-Invoke {"your-command-here"};

ただし、Aptはアップグレードまたはインストール用の事前起動フックを提供しないため、これはでのみ機能しapt-get updateます。
Andrew Domaszek

本当ですが、私は具体的に質問に答えていました!:)インストール前/インストール後の微調整が必​​要なすべての場合、OPに従ってdpkgフックを使用できます。
ジェレミー・デイビス

やや; 更新は常にアップグレード/インストールの前に実行されると想定しています。ネットワークアクセスが発生する前にすべてのコマンドをフックすることは、現在利用可能な(2017-05-17)aptフックでは不可能のようです。これはまだスクリプトの最良の答えですが、既存の自動更新スクリプトなどには役立ちません。
Andrew Domaszek

ああ、わかりました。ごめんなさい; はい、あなたは本当に良い点を持っています。したがって、apt-get updateを微調整できますが、dpkgフックが実行される前にapt-get installがダウンロードされますか?うーん、それは本当に最悪です!
ジェレミー・デイビス

何をしようとしていますか?自動更新が必要で、特定のリポジトリ(Debianセキュリティなど)からのみインストールする場合は、TurnKeyのcronaptスクリプト[1]などのスクリプトでcronaptを使用できます。sources.listエントリを個別のファイルに分割します。自動更新が必要なものは、security.sources.listにあります。[1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/...
ジェレミー・デイビス

2

最初にwhereis apt-getor を使用してapt-getがどこにあるかを判別しwhich apt-getます。/ usr / bin / apt-getにあると想定します

次に、/ usr / local / bin / apt-getに次の内容のファイルを作成します。

#!/bin/bash
# (commands to run before apt-get)
/usr/bin/apt-get "$@"

chmod +x /usr/local/bin/apt-get

これはディストリビューションのすべてのアップグレードに耐えることができますが、apt-getの動作を変更しないでください(他に何かをする前にコマンドを実行することを除いて)。おまけとして、コマンドライン引数を解析して、本当に必要なときにのみコマンドを実行できます。

(この回答は、ムハンマドからのフィードバックとマージされたモハマドエテマダールからの回答に基づいています


2

.bashrcファイルで「エイリアス」を使用できます。たとえば、それをルートの.bashrcファイルに入れます。

alias apt-get='echo blahblah && apt-get'

コマンドライン引数は、エイリアスの最後に自動的に追加されます。

echo blahblah必要なコマンドに置き換えるだけです。

ただし、この場合は、sudoではなくrootとしてコマンドを実行している場合にのみ機能します。


sudoで使用するために、このエイリアスを通常のユーザープロファイルに含めることはできますか?
Mohammad Etemaddar

1
はい、そう思います。試してください:alias apt-get='echo blahblah && sudo apt-get'。次に、たとえば- apt-get updateなしsudoでターミナルに入力するだけで、 自動的にsudoパスワードの入力を求められます。
ローマ

それは本当です。もちろん、「echo blahblah」はsu特権では機能しません。
Mohammad Etemaddar、

1
エイリアスは引数を適切に処理しないため、シェル関数またはスクリプト(/usr/local/binまたは内~/bin)を使用した方がよい場合があります。
スコット

1

まず、を使用してapt-getの場所を特定しwhereis apt-getます。/ usr / bin / apt-getにあると想定します

muruは言う、あなたは名前のスクリプトを作成することができますapt-get/usr/local/bin/前にある/usr/binDebianとUbuntuのでは$PATH。次に、次のコードを追加します(/usr/local/bin/apt-get):

#!/bin/bash
commands to run before apt-get
/usr/bin/apt-get "$@"

コメントとして提供してくれたmuruに感謝します。

他の方法:

もちろん、以前のものより良くない別の方法があります。

あなたはできる mv /usr/bin/apt-get /usr/bin/apt-get2

次に、/ usr / bin / apt-getに次の内容のファイルを作成します。

#!/bin/bash
commands to run before apt-get
apt-get2 "$@"

chmod +x /usr/bin/apt-get


これはdist-upgradeを生き延びますか?
Arne Babenhauserheide 2015年

はい。$@スクリプトがすべての引数で機能するようにします。
Mohammad Etemaddar

6
ねえ。置換を作成する場合は、DebianおよびUbuntuのデフォルトのPATHの/usr/local/bin/usr/binにあるに置きます。
muru

3
これは本当に悪いアドバイスです。(a)apt-get実行可能ファイルは、/usr/bin/apt-getではなくにありsbinます。(b)システムコマンドをいじらないでください。muruが言うように、ローカルのオーバーライドをで作成できますが/usr/local/bin、それでも良い解決策ではありません。
Faheem Mitha、2015年

@muru / usr / local / binは可能な方法のように思えます-私はそのことを考えていませんでした。ありがとうございました!
Arne Babenhauserheide

0

.bashrcファイルのエイリアスを試してください。ファイルが対応するアカウントにログインしたときにのみ機能します。エイリアスの構文は次のとおりです。

alias newcommand='command1; command2; command3' したがって、行は次のようになります。

alias apt-get='firstcommand; apt-get'

またはこれ:

alias apt-get='firstcommand && apt-get'

2番目でapt-getは、firstcommand成功した場合にのみ実行されます。


ルート/通常のユーザーの問題を明確にすることは別として、これは基本的に最初の回答の繰り返しです。
G-Manは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.