Làm thế nào để chạy một lệnh trước khi tải xuống với apt-get?


8

Làm cách nào để chạy lệnh trước khi apt-get bắt đầu tải xuống gói?

Tôi biết về hook trước khi gọi dpkg ( hook script vào apt-get ), nhưng dường như nó được chạy sau khi tải xuống.

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

Những gì chúng ta cần là chạy một lệnh trước khi tải xuống. Chính xác hơn: Tập lệnh phải chạy sau khi gọi apt-get nhưng trước khi apt-get truy cập bất kỳ tài nguyên trực tuyến nào.

Có cái gì đó giống như một cái móc Pre-Download không?

Điều quan trọng là việc cài đặt có thể được thực hiện mà không phải thay thế tập lệnh apt-get (và không làm bất cứ điều gì khác có thể được hoàn tác bằng một bản cập nhật).


2
Bạn có thể khai báo một hàm có tên apt-getchính nó sẽ gọi hàm thực apt-get. Tùy thuộc vào phạm vi bạn muốn nó có, hàm có thể được khai báo trong /etc/profilehoặc ~/.profilehoặc ~/.bashrc.
user43791

Chính xác thì "Tập lệnh phải chạy sau khi gọi apt-get nhưng trước khi apt-get truy cập bất kỳ tài nguyên trực tuyến nào" nghĩa là gì? Phần nào của apt-get cần được chạy trước khi hook của bạn có thể thực thi đúng cách?
jthill

@jthill chúng ta cần kích hoạt tải xuống một URL nhất định trước khi bất kỳ URL nào khác được truy cập. Lý do là chúng tôi tải xuống từ freenet (kho dữ liệu ẩn danh phi tập trung được sử dụng làm kho lưu trữ deb) và chúng tôi muốn kích hoạt một tìm kiếm tích cực cho phiên bản mới nhất trước khi tải xuống bất cứ thứ gì.
Arne Babenhauserheide

Từ các nhận xét, bạn đang hỏi cách thay thế lệnh hệ thống theo cách không thể bỏ qua và không thể bị xóa ngay cả bởi trình cài đặt của hệ thống. Bạn đang hỏi làm thế nào để rootkit hệ thống.
jthill

Nó sẽ hữu ích nếu bạn có thể mô tả trường hợp sử dụng của bạn. Hay nói cách khác, bạn đang cố gắng làm gì?
Faheem Mitha

Câu trả lời:


5

Điều gì về việc sử dụng apt pre / post-invoke hook?

Về cơ bản, nó tương tự như các hook trước / sau khi gọi dpkg nhưng đối với apt (mà tôi cho rằng thực sự là cái quan trọng trong kịch bản sử dụng của bạn). AFAIK có những cái khác nhưng tôi chỉ sử dụng như thế này.

Ví dụ

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

Apt không cung cấp một hook hook trước để nâng cấp hoặc Cài đặt, vì vậy điều này chỉ hoạt động cho apt-get update.
Andrew Domaszek

Đúng, nhưng tôi đã trả lời câu hỏi cụ thể! :) Bạn có thể sử dụng móc dpkg (theo OP) cho bất kỳ thứ gì yêu cầu chỉnh sửa cài đặt trước / sau.
Jeremy Davis

Loại; giả sử rằng bản cập nhật luôn được chạy trước khi nâng cấp / cài đặt. Việc nối tất cả các lệnh trước khi xảy ra truy cập mạng dường như là không thể với các hook apt hiện có (2017-05-17). Đây vẫn là câu trả lời tốt nhất cho kịch bản nhưng nó không giúp ích cho những thứ như tập lệnh cập nhật tự động hiện có.
Andrew Domaszek

Oh ok, tôi có được bạn bây giờ. Lấy làm tiếc; vâng bạn có một điểm thực sự tốt. Vì vậy, bạn có thể điều chỉnh cập nhật apt-get, nhưng cài đặt apt-get vẫn sẽ tải xuống, trước khi móc dpkg chạy?! Hmmm, thật là tệ!
Jeremy Davis

Bạn đang cố gắng làm gì? Nếu bạn muốn cập nhật tự động nhưng chỉ cài đặt từ các repos cụ thể (ví dụ: bảo mật Debian), thì bạn có thể sử dụng cronapt với một tập lệnh như tập lệnh cronapt của TurnKey [1]. Tách các mục nguồn.list của bạn thành các tệp riêng biệt; những cái mà bạn muốn cập nhật tự động đi trong security.source.list. [1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/ khăn
Jeremy Davis

2

Đầu tiên xác định nơi apt-get sử dụng whereis apt-gethoặc which apt-get; Tôi sẽ giả sử nó trong / usr / bin / apt-get

Sau đó tạo một tệp trong / usr / local / bin / apt-get với nội dung này:

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

hiện nay chmod +x /usr/local/bin/apt-get.

Điều này sẽ tồn tại trong tất cả các nâng cấp của bản phân phối nhưng nó không nên thay đổi hành vi của apt-get (ngoài việc chạy lệnh trước khi làm bất cứ điều gì khác). Như một phần thưởng, nó có thể phân tích các đối số dòng lệnh để chỉ chạy lệnh khi thực sự cần thiết.

(Câu trả lời này được xây dựng dựa trên câu trả lời từ Mohammad Etemaddar , được hợp nhất với phản hồi từ muru)


2

Bạn có thể sử dụng một "bí danh" trong tệp .bashrc. Ví dụ: đặt nó trong tệp .bashrc gốc của bạn:

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

Đối số dòng lệnh sẽ được thêm tự động vào cuối bí danh.

Chỉ cần thay thế echo blahblahbằng lệnh bạn cần.

Nhưng trong trường hợp này, nó chỉ hoạt động khi bạn thực thi các lệnh với quyền root (không phải sudo).


Có thể đặt bí danh này trong hồ sơ người dùng bình thường để sử dụng nó bằng sudo?
Mohammad Etemaddar

1
Vâng, tôi thik như vậy. Hãy thử : alias apt-get='echo blahblah && sudo apt-get'. Sau đó, bạn chỉ cần nhập vào thiết bị đầu cuối chẳng hạn - apt-get updatekhông có sudo, và bạn sẽ được yêu cầu tự động nhập mật khẩu sudo.
La Mã

đúng rồi. tất nhiên sau đó 'echo blahblah' sẽ không hoạt động dưới các đặc quyền su.
Mohammad Etemaddar

1
Có thể tốt hơn khi sử dụng hàm shell hoặc tập lệnh (trong /usr/local/binhoặc ~/bin), vì các bí danh không xử lý tốt các đối số.
Scott

1

Đầu tiên xác định nơi apt-get sử dụng whereis apt-get; Tôi sẽ giả sử nó trong / usr / bin / apt-get

như muru nói, Bạn có thể tạo một kịch bản có tên apt-gettrong /usr/local/bin/đó là trước /usr/bintrong Debian và Ubuntu $PATH. Sau đó đặt đoạn mã sau vào nó ( /usr/local/bin/apt-get):

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

Cảm ơn muru đã cung cấp như bình luận.

Cách khác:

Tất nhiên có một cách khác không tốt hơn cách trước.

Bạn có thể mv /usr/bin/apt-get /usr/bin/apt-get2

Sau đó, tạo một tệp trong / usr / bin / apt-get với nội dung này:

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

hiện nay chmod +x /usr/bin/apt-get


Điều này có tồn tại một nâng cấp xa?
Arne Babenhauserheide

Đúng. $@gây ra kịch bản để làm việc với mọi đối số.
Mohammad Etemaddar

6
Eek. Nếu bạn muốn tạo một sự thay thế, hãy đặt nó vào /usr/local/bintrước, /usr/bintrong PATH mặc định trong Debian và Ubuntu.
muru

3
Đây thực sự là một lời khuyên tồi tệ, xin lỗi. (a) Việc apt-getthực thi được đặt tại /usr/bin/apt-get, không phải sbin. (b) Đừng lộn xộn với các lệnh hệ thống. Như muru nói, bạn có thể tạo một ghi đè cục bộ /usr/local/bin, mặc dù đó không phải là một giải pháp tốt.
Faheem Mitha

@muru / usr / local / bin nghe có vẻ là một cách có thể đi - Tôi đã không nghĩ về điều đó. Cảm ơn bạn!
Arne Babenhauserheide

0

Hãy thử một bí danh trong .bashrctập tin. Nó chỉ hoạt động khi đăng nhập vào tài khoản mà tập tin tương ứng. Cú pháp của bí danh là:

alias newcommand='command1; command2; command3' Vì vậy, dòng của bạn có thể trông giống như thế này:

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

Hoặc này:

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

Với lần thứ hai, apt-getsẽ chỉ thực hiện nếu firstcommandthành công.


Ngoài việc làm rõ vấn đề người dùng root / bình thường, đây thực chất là một sự lặp lại của câu trả lời đầu tiên.
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.