如果代理不可用,该如何忽略?


15

按照最佳方法在LAN上缓存apt下载的说明进行操作?,我已经在本地网络中设置了缓存代理。由于那台机器并不总是处于开机状态,因此我希望能够刷新源列表并安装软件包,而不使用该代理(如果不可用)。

我已经阅读了的手册页中的“ 获取组”部分apt.conf(5),但是找不到“ Silent-Fail”之类的选项。

目前,sudo apt-get update由于无法建立连接,因此相关命令失败。那么,如何配置客户端,以便在代理不可用时将其忽略?


您是在使用Zeroconf发现还是在每个客户端上手动设置代理?
豪尔赫·卡斯特罗

由于可能存在防火墙/禁用了广播,因此我正在手动设置代理。
Lekensteyn 2011年

Answers:


20

有一个未记录的设置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 <lekensteyn@gmail.com>

# 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=1show_proxy_messages=0


Lekensteyn,我是否可以将其粘贴到puppet-apt-cacher-ng中作为选项apt-cacher-ng::client
Garth Kidd

1
授予权限,随您便吧:)
Lekensteyn'4

2
我很高兴在前一段时间设置apt-cacher-ng时找到了这个答案。我在我的一台家用计算机(192.168.0.2)上安装了apt-cacher-ng。该脚本觉得有点矫枉过正了我的情况,所以我写了一个简化的检测,HTTP代理:if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi。让我们希望删除未记录的功能:)
geirha

2
我广泛的记录脚本为了你的利益,如果你关心的大小可以使它甚至更短i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT:P
Lekensteyn

3

现在有一种官方支持的方式来执行此操作-使用选项- 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解析外部命令的stderr和stdout。


1

/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突耳。

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.