在使用apt-get下载之前如何运行命令?


8

如何在apt-get开始下载软件包之前运行命令?

我知道dpkg调用前挂钩(将脚本挂钩到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,该函数本身将调用real apt-get。根据您希望的范围,可以在/etc/profile~/.profile或中声明函数~/.bashrc
user43791

“该脚本必须在调用apt-get之后但在apt-get访问任何在线资源之前运行”究竟是什么意思?您的挂钩可以正确执行之前,生产附件的哪一部分需要运行?
jthill

@jthill我们需要在访问任何其他URL之前触发给定URL的下载。原因是我们从freenet(分散的匿名数据存储用作deb存储库)下载,并且我们希望在下载任何内容之前触发对最新版本的一次积极搜索。
Arne Babenhauserheide

从注释中,您正在询问如何以一种无法被绕过并且即使系统的安装程序也无法将其删除的方式替换系统命令。您在问如何对系统进行rootkit操作。
jthill 2015年

如果您可以描述您的用例,将很有帮助。换句话说,您正在尝试做什么?
Faheem Mitha

Answers:


5

如何使用apt之前/之后调用挂钩?

从本质上讲,它类似于dpkg调用前/调用后的钩子,但是对于apt(我认为这实际上是您使用情况中的重要钩子)。AFAIK还有其他人,但我只是这样使用。

例如

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

不过,Apt并未提供用于升级或安装的预调用挂钩,因此仅适用于apt-get update
Andrew Domaszek '17

是的,但我是专门回答这个问题的!:)您可以将dpkg挂钩(根据OP)用于需要进行预/后安装调整的任何内容。
杰里米·戴维斯

有点儿; 假设该更新始终在升级/安装之前运行。使用当前(2017-05-17)可用的apt挂钩似乎无法在发生网络访问之前挂钩所有命令。对于脚本编写来说,这仍然是最好的答案,但是对于现有的自动更新脚本之类的东西并没有帮助。
Andrew Domaszek '17

哦,好的,我现在得到你。抱歉; 是的,你有一个非常好的观点。因此,您可以调整apt-get更新,但是在运行dpkg挂钩之前,apt-get install仍会下载?嗯,那真糟!
杰里米·戴维斯

您想做什么?如果您要自动更新,但仅从特定的软件仓库安装(例如Debian安全性),则可以将cronapt与TurnTurn的cronapt脚本[1]之类的脚本一起使用。将您的sources.list条目拆分为单独的文件;您要从中自动更新的文件进入security.sources.list。[1] github.com/turnkeylinux/common/blob/master/conf/turnkey.d/…–
杰里米·戴维斯

2

首先使用whereis apt-get或来确定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的行为(除了在执行其他操作之前运行命令外)。另外,它可以解析命令行参数以仅在真正需要时运行命令。

(此答案基于Mohammad Etemaddar答案,并结合了muru的反馈)


2

您可以在.bashrc文件中使用“别名”。例如,将其放在根.bashrc文件中:

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

命令行参数将自动添加到别名的末尾。

只需替换echo blahblah为所需的命令即可。

但是在这种情况下,仅当您以root用户(而不是sudo)执行命令时,它才有效。


是否可以将此别名放入普通用户配置文件中,以便通过sudo使用它?
Mohammad Etemaddar

1
是的,我这么认为。试试:alias apt-get='echo blahblah && sudo apt-get'。然后,您只需要输入终端(例如- apt-get update不带)sudo,系统会自动要求您输入sudo密码。
罗马

这是真的。当然,“ echo blahblah”在su特权下不会起作用。
Mohammad Etemaddar

1
最好使用shell函数或脚本(in /usr/local/bin~/bin),因为别名不能很好地处理参数。
斯科特

1

首先确定使用apt-get的位置whereis apt-get;我假设它在/ usr / bin / apt-get中

作为穆鲁说,你可以创建一个名为脚本apt-get/usr/local/bin/这之前,/usr/bin在Debian和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


这样可以在远程升级后幸存吗?
Arne Babenhauserheide 2015年

是。$@使脚本与每个参数一起使用。
Mohammad Etemaddar

6
真是的 如果要创建替换项,请将其放在中/usr/local/bin,它/usr/bin在Debian和Ubuntu中的默认PATH中位于前面。
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'

对于第二个,apt-get仅在firstcommand成功的情况下执行。


除了阐明root用户/普通用户问题之外,这实际上是对第一个答案的重申。
G-Man说'恢复莫妮卡'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.