프록시를 사용할 수없는 경우 어떻게 무시합니까?


15

LAN에서 적절한 다운로드를 캐시하는 가장 좋은 방법 의 지침을 따르 십니까? 로컬 네트워크에 캐싱 프록시를 설정했습니다. 해당 시스템이 항상 가동되는 것은 아니므로 사용할 수없는 경우 해당 프록시를 사용하지 않고 소스 목록을 새로 고치고 패키지를 설치할 수 있기를 원합니다.

의 매뉴얼 페이지에서 획득 그룹 섹션을 이미 읽었 apt.conf(5)지만 "Silent-Fail"과 같은 옵션을 찾을 수 없습니다.

현재 sudo apt-get update연결이 설정되지 않아 관련 명령이 실패합니다. 프록시를 사용할 수없는 경우 무시되도록 클라이언트를 어떻게 구성합니까?


zeroconf 감지를 사용 중입니까? 아니면 각 클라이언트에서 프록시를 수동으로 설정합니까?
Jorge Castro

방화벽 / 방송 비활성화로 인해 프록시를 수동으로 설정하고 있습니다.
Lekensteyn

답변:


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=1하십시오 show_proxy_messages=0.


Lekensteyn, 옵션 으로 puppet-apt-cacher-ng 에 붙여 넣을 권한 이 apt-cacher-ng::client있습니까?
Garth Kidd

1
권한 부여, 원하는대로 수행 :)
Lekensteyn

2
apt-cacher-ng를 다시 설정하면이 답변을 찾았습니다. 가정용 컴퓨터 중 하나에 apt-cacher-ng를 설치했습니다 (192.168.0.2). 이 스크립트는 필자의 경우 약간 과잉이라고 느꼈기 때문에 단순화 된 detect-http-proxy를 작성했습니다 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.confman 페이지 참조). 동작은 문서화되지 않은 오래된 Acquire::http::ProxyAutoDetect(신규 / 구 구성 옵션에서 하이픈의 존재 / 부족)과 유사하며 이전 버전과 거의 호환되지만 확장되었습니다 ...

문서를 개선하기 위해 apt 유지 관리자에게 패치를 제출하는 과정에 있지만 배포판이 꽤 오랫동안 제공되는 apt 버전으로 만들 가능성이 낮으므로 제안 된 패치는 다음과 같습니다.

Acquire::http::Proxy-Auto-Detect사용할 http 프록시를 감지하는 외부 명령을 지정하는 데 사용할 수 있습니다. APT는 명령을 여러 번 호출 할 수 있으며 URI를 첫 번째 유일한 매개 변수로 명령에 전달합니다. APT는 해당 명령이 stdout에서 문제의 URI에 연락하는 데 사용되는 프록시를 style의 단일 행 으로 사용 http://proxy:port/하거나 DIRECT프록시를 사용하지 않아야 할 경우 단어 를 출력 할 것으로 예상합니다 . 출력이 없으면 일반 프록시 설정을 사용해야 함을 나타냅니다.

호스트 별 프록시 구성이 이미를 통해 설정된 경우 호스트에 자동 감지가 사용되지 않습니다 Acquire::http::Proxy::HOST.

외부 명령과의 상호 작용을 진단하려면 명령 줄 매개 변수 를 설정 Debug::Acquire::http=yes및 / 또는 Debug::Acquire::https=yes사용하십시오 -o.

apt의 시험판 버전 1.3 ~ exp2 ~ 1.3을 사용하는 경우 apt가 stdout과 함께 외부 명령 의 stderr 을 구문 분석하게하는 버그 (1.3.1로 수정 될 수 있음)가 있습니다.


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 처 그를 정상적으로 인쇄합니다.

소스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.