按照在 LAN 上缓存 apt 下载的最佳方法是什么?,我在本地网络中设置了一个缓存代理。由于该机器并非始终处于运行状态,因此我希望能够在不使用代理的情况下刷新源列表并安装软件包。
我已经读过获取组手册页中的部分apt.conf(5)
,但我找不到“Silent-Fail”这样的选项。
目前,sudo apt-get update
相关命令失败,因为无法建立连接。那么如何配置客户端,以便在代理不可用时忽略代理?
答案1
有一个未记录的设置,Acquire::http::ProxyAutoDetect
。此设置应包含二进制文件的完整路径,并且不能包含参数。该命令应输出要使用的代理(例如:http://10.0.0.1:8000
)。
根据以上信息,可以创建一个脚本,在设置代理之前先尝试代理。如果没有可用的代理,则应使用直接连接。
http://10.0.0.1:8000/
下面是一个尝试和代理的代理检测脚本http://10.0.0.2:8000
。
输入代码/etc/apt/detect-http-proxy
:
#!/bin/bash
# detect-http-proxy - Returns a HTTP proxy which is available for use
# Author: Lekensteyn <[email protected]>
# Supported since APT 0.7.25.3ubuntu1 (Lucid) and 0.7.26~exp1 (Debian Squeeze)
# Unsupported: Ubuntu Karmic and before, Debian Lenny and before
# Put this file in /etc/apt/detect-http-proxy and create and add the below
# configuration in /etc/apt/apt.conf.d/30detectproxy
# Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";
# APT calls this script for each host that should be connected to. Therefore
# you may see the proxy messages multiple times (LP 814130). If you find this
# annoying and wish to disable these messages, set show_proxy_messages to 0
show_proxy_messages=1
# on or more proxies can be specified. Note that each will introduce a routing
# delay and therefore its recommended to put the proxy which is most likely to
# be available on the top. If no proxy is available, a direct connection will
# be used
try_proxies=(
10.0.0.1:8000
10.0.0.2:8000
)
print_msg() {
# \x0d clears the line so [Working] is hidden
[ "$show_proxy_messages" = 1 ] && printf '\x0d%s\n' "$1" >&2
}
for proxy in "${try_proxies[@]}"; do
# if the host machine / proxy is reachable...
if nc -z ${proxy/:/ }; then
proxy=http://$proxy
print_msg "Proxy that will be used: $proxy"
echo "$proxy"
exit
fi
done
print_msg "No proxy will be used"
# Workaround for Launchpad bug 654393 so it works with Debian Squeeze (<0.8.11)
echo DIRECT
现在,必须配置 APT 以使用上述代理检测脚本,因此请输入以下代码/etc/apt/apt.conf.d/30detectproxy
:
# Fail immediately if a file could not be retrieved. Comment if you have a bad
# Internet connection
Acquire::Retries 0;
# undocumented feature which was found in the source. It should be an absolute
# path to the program, no arguments are allowed. stdout contains the proxy
# server, stderr is shown (in stderr) but ignored by APT
Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";
我还将下一个代码放入文件中,以防止某些主机被代理。
# Override the default proxy, DIRECT causes a direct connection to be used
Acquire::http::Proxy {
deb.opera.com DIRECT;
dl.google.com DIRECT;
};
默认情况下,脚本会输出是否使用代理。要禁用此功能,请编辑/etc/apt/detect-http-proxy
并更改show_proxy_messages=1
为show_proxy_messages=0
。
答案2
现在有一种官方支持的方法可以做到这一点 - 使用选项 - Acquire::http::Proxy-Auto-Detect
(参见apt.conf
手册页)。行为类似于旧的未记录的Acquire::http::ProxyAutoDetect
(注意新/旧配置选项中连字符的存在/不存在),它在很大程度上向后兼容,但已经扩展...
我正在向 apt 维护人员提交一个补丁来改进文档,但由于这不太可能在相当长的一段时间内成为随发行版一起发布的 apt 版本,因此我将在此处包含提议的补丁的文本:
Acquire::http::Proxy-Auto-Detect
可用于指定外部命令以发现要使用的 http 代理。APT 可能会多次调用该命令,并将 URI 作为其第一个也是唯一的参数传递给该命令。APT 期望该命令在其 stdout 上以 的样式输出用于联系相关 URI 的代理http://proxy:port/
,或者如果不应使用代理则输出 的单词DIRECT
。没有输出表示应使用通用代理设置。
请注意,如果已经通过 设置了主机特定的代理配置,则不会对主机使用自动检测Acquire::http::Proxy::HOST
。
要诊断与外部命令的交互,请设置Debug::Acquire::http=yes
和/或Debug::Acquire::https=yes
使用-o
命令行参数。
请注意,使用的是 apt 的预发布版本,版本 1.3~exp2 到 1.3 存在一个错误(可能由 1.3.1 修复),导致 apt 解析标准错误外部命令与标准输出一起。
答案3
/etc/apt/apt.conf.d/02proxy
:
Acquire::http::Proxy-Auto-Detect "/usr/local/bin/apt-proxy-detect.sh";
/usr/local/bin/apt-proxy-detect.sh
:
#!/bin/bash
IP=192.168.88.1
PORT=3142
if nc -w1 -z $IP $PORT; then
echo -n "http://${IP}:${PORT}"
else
echo -n "DIRECT"
fi
命令行
- 若缺失则需要
nc
工作(sudo apt-get install netcat
)。 - 确保你
chmod +x /usr/local/bin/apt-proxy-detect.sh
- 指定脚本时使用完整路径。
怎么运行的
如果可以连接到代理,它会打印出 APT 使用的代理。如果不能,它会打印出 DIRECT,并且 APT 正常运行。
答案4
好的 - 已经有 12 年历史了,但在搜索中排名前 5,所以我尽了最大的努力通过以下实现来解决问题。
https://github.com/hastmu/apt-proxy-detect
这将检查代理是否适用于所需的 URL,如果不行,则返回无代理,从而导致直接连接。这样或那样的目标是最终能起作用。