Làm cách nào để bỏ qua proxy nếu không có sẵn?


15

Làm theo các hướng dẫn trong Cách tốt nhất để lưu trữ các bản tải xuống apt trên mạng LAN? , Tôi đã thiết lập proxy lưu trữ trong mạng cục bộ của mình. Vì máy đó không phải lúc nào cũng hoạt động, tôi muốn có thể làm mới danh sách nguồn và cài đặt các gói mà không cần sử dụng proxy đó nếu không có sẵn.

Tôi đã đọc phần Nhóm mua lại trong trang hướng dẫn apt.conf(5), nhưng tôi không thể tìm thấy một tùy chọn như "Thất bại thầm lặng".

Hiện tại, sudo apt-get updatevà các lệnh liên quan không thành công vì không có kết nối nào có thể được thiết lập. Vậy làm cách nào để định cấu hình máy khách để proxy bị bỏ qua nếu nó không khả dụng?


Bạn đang sử dụng khám phá zeroconf hay bạn tự đặt proxy trên mỗi máy khách?
Jorge Castro

Tôi đang cài đặt proxy theo cách thủ công vì có thể tường lửa / truyền phát bị vô hiệu hóa.
Lekensteyn

Câu trả lời:


20

Có một thiết lập không có giấy tờ , Acquire::http::ProxyAutoDetect. Cài đặt này phải chứa đường dẫn đầy đủ đến nhị phân và không thể có đối số. Lệnh sẽ xuất proxy được sử dụng (ví dụ http://10.0.0.1:8000:).

Với các thông tin trên, một tập lệnh có thể được tạo để thử proxy trước khi đặt nó. Nếu không có proxy, kết nối trực tiếp sẽ được sử dụng.

Dưới đây là một kịch bản phát hiện proxy để thử http://10.0.0.1:8000/http://10.0.0.2:8000proxy.

Đặt mã vào /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

Bây giờ, APT phải được cấu hình để sử dụng tập lệnh phát hiện proxy ở trên, vì vậy hãy đặt đoạn mã sau vào /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";

Tôi cũng đã đặt mã tiếp theo vào tệp để ngăn một số máy chủ lưu trữ.

# Override the default proxy, DIRECT causes a direct connection to be used
Acquire::http::Proxy {
    deb.opera.com DIRECT;
    dl.google.com DIRECT;
};

Theo mặc định, tập lệnh xuất ra liệu proxy có được sử dụng hay không. Để vô hiệu hóa điều đó, chỉnh sửa /etc/apt/detect-http-proxyvà thay đổi show_proxy_messages=1thành show_proxy_messages=0.


Lekensteyn, tôi có thể có quyền của bạn để dán nó vào con rối-apt-cacher-ng như một tùy chọn apt-cacher-ng::clientkhông?
Garth Kidd

1
Quyền được cấp, làm bất cứ điều gì bạn muốn với nó :)
Lekensteyn

2
Tôi rất vui vì đã tìm thấy câu trả lời này khi tôi thiết lập apt-cacher-ng một lúc trước. Tôi đã cài đặt apt-cacher-ng trên một trong các máy tính gia đình của mình (192.168.0.2). Kịch bản cảm thấy hơi quá mức cho trường hợp của tôi, vì vậy tôi đã viết một proxy-http-proxy đơn giản hóa : if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Chúng ta hãy hy vọng tính năng không có giấy tờ sẽ bị xóa :)
geirha

2
Tôi đã ghi lại kịch bản rộng rãi vì lợi ích của bạn, nếu bạn quan tâm đến kích thước, bạn có thể làm cho nó ngắn hơn nữa với i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn

3

Bây giờ có một cách chính thức được hỗ trợ để làm điều này - sử dụng tùy chọn - Acquire::http::Proxy-Auto-Detect(xem apt.conftrang hướng dẫn). Hành vi tương tự như không có giấy tờ cũ Acquire::http::ProxyAutoDetect(lưu ý sự hiện diện / vắng mặt của dấu gạch nối trong các tùy chọn cấu hình mới / cũ), phần lớn tương thích ngược, nhưng đã được mở rộng ...

Tôi đang trong quá trình gửi một bản vá cho các nhà bảo trì apt để cải thiện tài liệu, nhưng vì điều này khó có thể biến nó thành một phiên bản apt được phát hành trong một thời gian dài, tôi sẽ bao gồm văn bản của Bản vá được đề xuất ở đây:

Acquire::http::Proxy-Auto-Detectcó thể được sử dụng để chỉ định một lệnh bên ngoài để khám phá proxy http để sử dụng. APT có thể gọi lệnh nhiều lần và sẽ truyền URI cho lệnh làm tham số đầu tiên và duy nhất. APT hy vọng lệnh xuất ra proxy được sử dụng để liên hệ với URI được đề cập trên thiết bị xuất chuẩn của nó dưới dạng một dòng theo kiểu http://proxy:port/hoặc từ DIRECTnếu không sử dụng proxy. Không có đầu ra chỉ ra rằng các cài đặt proxy chung nên được sử dụng.

Lưu ý rằng tự động phát hiện sẽ không được sử dụng cho máy chủ nếu cấu hình proxy dành riêng cho máy chủ đã được đặt qua Acquire::http::Proxy::HOST.

Để chẩn đoán các tương tác với lệnh bên ngoài, hãy đặt Debug::Acquire::http=yesvà / hoặc Debug::Acquire::https=yesví dụ: sử dụng -otham số dòng lệnh.

Lưu ý rằng đang sử dụng phiên bản phát hành trước của apt, các phiên bản 1.3 ~ exp2 đến 1.3 thì có một lỗi (có thể được sửa bởi 1.3.1) khiến apt phân tích cú pháp của stderr của lệnh bên ngoài cùng với thiết bị xuất chuẩn.


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

Dòng lệnh

  • Nó cần ncphải làm việc ( sudo apt-get install netcat) nếu thiếu.
  • Hãy chắc chắn rằng bạn chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Sử dụng đường dẫn đầy đủ khi chỉ định tập lệnh.

Làm thế nào nó hoạt động

Nếu nó có thể kết nối với proxy, nó sẽ in proxy ra APT sử dụng nó. Nếu không thể, nó sẽ in ra chu kỳ TRỰC TIẾP và APT bình thường.

Nước xốt

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.