Bagaimana cara menjalankan perintah sebelum mengunduh dengan apt-get?

8

Bagaimana saya bisa menjalankan perintah sebelum apt-get mulai mengunduh paket?

Saya tahu tentang kait pra-pemanggilan dpkg ( kaitkan skrip ke apt-get ), tetapi itu tampaknya dijalankan setelah pengunduhan.

$ 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/

Yang kita butuhkan adalah menjalankan perintah sebelum mengunduh. Lebih tepatnya: Skrip harus dijalankan setelah memanggil apt-get tetapi sebelum apt-get mengakses sumber daya online apa pun.

Apakah ada sesuatu seperti kait Pra-Unduh?

Adalah penting bahwa instalasi dapat dilakukan tanpa harus mengganti skrip apt-get (dan tanpa melakukan hal lain yang dapat dibatalkan oleh pembaruan).

Arne Babenhauserheide
sumber
2
Anda bisa mendeklarasikan fungsi bernama apt-getyang dengan sendirinya akan memanggil yang asli apt-get. Bergantung pada cakupan yang Anda inginkan, fungsi tersebut dapat dideklarasikan di /etc/profileatau ~/.profileatau ~/.bashrc.
user43791
Apa sebenarnya artinya "Script harus dijalankan setelah memanggil apt-get tetapi sebelum apt-get mengakses sumber daya online" apa artinya? Bagian mana dari apt-get produksi yang perlu dijalankan sebelum hook Anda dapat dieksekusi dengan baik?
jthill
@jthill kita perlu memicu pengunduhan URL yang diberikan sebelum URL lain diakses. Alasannya adalah bahwa kami mengunduh dari freenet (datastore anonim desentralisasi yang digunakan sebagai repositori deb) dan kami ingin memicu satu pencarian agresif untuk versi terbaru sebelum mengunduh apa pun.
Arne Babenhauserheide
Dari komentar, Anda bertanya bagaimana cara mengganti perintah sistem dengan cara yang tidak dapat dilewati dan tidak dapat dihapus bahkan oleh penginstal sistem. Anda bertanya bagaimana cara rootkit sistem.
jthill
Akan sangat membantu jika Anda dapat menggambarkan use case Anda. Atau dengan kata lain, apa yang Anda coba lakukan?
Faheem Mitha

Jawaban:

5

Bagaimana dengan menggunakan kait apt pre / post-invoke?

Pada dasarnya ini mirip dengan kait dpkg pre / post-invoke tetapi untuk apt (yang saya asumsikan sebenarnya adalah yang penting dalam skenario penggunaan Anda). AFAIK ada yang lain tapi saya hanya pakai seperti ini.

Misalnya

$ sudo cat /etc/apt/apt.conf.d/05new-hook
APT::Update::Pre-Invoke {"your-command-here"};
Jeremy Davis
sumber
Apt tidak menyediakan kait pra-pemanggilan untuk Upgrade atau Instal, jadi ini hanya berfungsi untuk apt-get update.
Andrew Domaszek
Benar, tetapi saya menjawab pertanyaan itu secara khusus! :) Anda dapat menggunakan kait dpkg (sesuai OP) untuk apa pun yang memerlukan pra / pasca instal tweak.
Jeremy Davis
Agak; dengan asumsi bahwa pembaruan selalu dijalankan sebelum meningkatkan / menginstal. Mengaitkan semua perintah sebelum akses jaringan terjadi tampaknya tidak mungkin dengan kait apt yang tersedia saat ini (2017-05-17). Ini masih merupakan jawaban terbaik untuk skrip tetapi tidak membantu untuk hal-hal seperti skrip pembaruan otomatis yang ada.
Andrew Domaszek
Oh ok, saya mengerti sekarang. Maaf; ya, Anda memiliki poin yang sangat bagus. Jadi Anda dapat men-tweak pembaruan apt-get, tetapi instalasi apt-get masih akan mengunduh, sebelum kait dpkg akan berjalan ?! Hmmm, itu benar-benar menyebalkan!
Jeremy Davis
Apa yang Anda coba lakukan? Jika Anda ingin pembaruan otomatis tetapi hanya menginstal dari repo tertentu (misalnya keamanan Debian), maka Anda dapat menggunakan cronapt dengan skrip seperti skrip cronapt TurnKey [1]. Pisahkan entri sources.list Anda menjadi file terpisah; yang ingin Anda perbarui otomatis masuk di security.sources.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…
Jeremy Davis
2

Pertama menentukan di mana apt-get menggunakan whereis apt-getatau which apt-get; Saya akan menganggap itu di / usr / bin / apt-get

Kemudian buat file di / usr / local / bin / apt-get dengan konten ini:

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

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

Ini harus bertahan dari semua peningkatan distribusi tetapi tidak boleh mengubah perilaku apt-get (selain menjalankan perintah sebelum melakukan hal lain). Sebagai bonus, itu bisa menguraikan argumen baris perintah untuk hanya menjalankan perintah ketika itu benar-benar diperlukan.

(Jawaban ini dibangun berdasarkan jawaban Mohammad Etemaddar , digabung dengan umpan balik dari muru)

Arne Babenhauserheide
sumber
2

Anda dapat menggunakan "alias" di file .bashrc. Misalnya, taruh itu di file root .bashrc Anda:

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

Argumen baris perintah akan ditambahkan secara otomatis ke akhir alias.

Cukup ganti echo blahblahdengan perintah yang Anda butuhkan.

Tetapi dalam kasus ini, ini hanya berfungsi ketika Anda menjalankan perintah sebagai root (bukan sudo).

Roma
sumber
Apakah mungkin untuk memasukkan alias ini di profil pengguna normal untuk menggunakannya oleh sudo?
Mohammad Etemaddar
1
Ya, saya pikir begitu. Cobalah: alias apt-get='echo blahblah && sudo apt-get'. Maka Anda hanya perlu mengetikkan terminal misalnya - apt-get updatetanpa sudo, dan Anda akan diminta kata sandi sudo secara otomatis.
Roman
itu benar. tentu saja kemudian 'echo blahblah' tidak akan berfungsi di bawah hak istimewa su.
Mohammad Etemaddar
1
Mungkin lebih baik menggunakan fungsi shell atau skrip (dalam /usr/local/binatau ~/bin), karena alias tidak menangani argumen dengan baik.
Scott
1

Pertama menentukan di mana apt-get menggunakan whereis apt-get; Saya akan menganggap itu di / usr / bin / apt-get

sebagai Muru mengatakan, Anda dapat membuat skrip bernama apt-getdi /usr/local/bin/yang sebelumnya /usr/bindi Debian dan Ubuntu $PATH. Kemudian masukkan kode berikut ke sana ( /usr/local/bin/apt-get):

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

Terima kasih muru untuk tawaran sebagai komentar.

Cara lain:

Tentu saja ada cara lain yang tidak lebih baik dari yang sebelumnya.

Kamu bisa mv /usr/bin/apt-get /usr/bin/apt-get2

Kemudian buat file di / usr / bin / apt-get dengan konten ini:

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

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

Mohammad Etemaddar
sumber
apakah ini bertahan dari dist-upgrade?
Arne Babenhauserheide
Iya. $@menyebabkan skrip bekerja dengan setiap argumen.
Mohammad Etemaddar
6
Eek. Jika Anda ingin membuat pengganti, masukkan /usr/local/bin, yang ada /usr/bindi PATH default di Debian dan Ubuntu.
muru
3
Ini saran yang sangat buruk, maaf. (a) apt-getEksekusi terletak di /usr/bin/apt-get, bukan sbin. (B) Jangan main-main dengan perintah sistem. Seperti yang dikatakan muru, Anda dapat membuat override lokal /usr/local/bin, meskipun itu pun bukan solusi yang baik.
Faheem Mitha
@muru / usr / local / bin terdengar seperti cara yang mungkin untuk pergi - saya belum memikirkan itu. Terima kasih!
Arne Babenhauserheide
0

Coba alias di .bashrcfile. Ini hanya berfungsi ketika masuk ke akun yang sesuai dengan file. Sintaks alias adalah:

alias newcommand='command1; command2; command3' Jadi baris Anda mungkin terlihat sedikit seperti ini:

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

Atau ini:

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

Dengan yang kedua, apt-gethanya akan mengeksekusi jika firstcommandberhasil.

Will Dereham
sumber
Selain mengklarifikasi masalah pengguna root / normal, ini pada dasarnya adalah pengulangan jawaban pertama.
G-Man Mengatakan 'Reinstate Monica'