Bagaimana saya mengabaikan proxy jika tidak tersedia?

15

Mengikuti instruksi di Cara terbaik untuk menyimpan cache unduhan unduhan di LAN? , Saya telah menyiapkan proxy caching di jaringan lokal saya. Karena mesin itu tidak selalu menyala, saya ingin dapat me-refresh daftar sumber dan menginstal paket tanpa menggunakan proxy itu jika tidak tersedia.

Saya sudah membaca bagian grup Acquire di halaman manual apt.conf(5), tapi saya tidak bisa menemukan opsi seperti "Silent-Fail".

Saat ini, sudo apt-get updatedan perintah terkait gagal karena tidak ada koneksi yang dapat dibuat. Jadi, bagaimana cara mengkonfigurasi klien sehingga proksi diabaikan jika tidak tersedia?

Lekensteyn
sumber
Apakah Anda menggunakan penemuan zeroconf atau apakah Anda secara manual mengatur proxy pada setiap klien?
Jorge Castro
Saya mengatur proxy secara manual karena kemungkinan firewall / penyiaran dinonaktifkan.
Lekensteyn

Jawaban:

20

Ada pengaturan tidak berdokumen Acquire::http::ProxyAutoDetect,. Pengaturan ini harus berisi path lengkap ke biner dan tidak dapat memiliki argumen. Perintah harus menampilkan proksi yang akan digunakan (contoh http://10.0.0.1:8000:).

Dengan informasi di atas, skrip dapat dibuat yang mencoba proxy sebelum menyetelnya. Jika tidak ada proxy yang tersedia, koneksi langsung harus digunakan.

Di bawah ini adalah skrip deteksi proxy yang mencoba http://10.0.0.1:8000/dan http://10.0.0.2:8000proksi.

Masukkan kode /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

Sekarang, APT harus dikonfigurasi untuk menggunakan skrip deteksi proxy di atas, jadi masukkan kode berikut ini /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";

Saya juga meletakkan kode selanjutnya ke file untuk mencegah beberapa host dari proksi.

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

Secara default, skrip menampilkan apakah proxy digunakan atau tidak. Untuk menonaktifkannya, edit /etc/apt/detect-http-proxydan ubah show_proxy_messages=1ke show_proxy_messages=0.

Lekensteyn
sumber
Lekensteyn, bisakah saya minta izin Anda untuk menempelkannya ke puppet-apt-cacher-ng sebagai opsi apt-cacher-ng::client?
Garth Kidd
1
Izin diberikan, lakukan apa pun yang Anda mau dengannya :)
Lekensteyn
2
Saya sangat senang saya menemukan jawaban ini ketika saya mengatur apt-cacher-ng beberapa waktu lalu. Saya telah menginstal apt-cacher-ng di salah satu komputer rumah saya (192.168.0.2). Script merasa sedikit berlebihan untuk kasus saya, jadi saya menulis disederhanakan mendeteksi-http-proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Semoga saja fitur yang tidak berdokumen dihapus :)
geirha
2
Saya mendokumentasikan skrip ini secara ekstensif untuk keuntungan Anda, jika Anda peduli tentang ukuran, Anda dapat membuatnya lebih pendek dengan i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn
3

Sekarang ada cara yang didukung secara resmi untuk melakukan ini - menggunakan opsi - Acquire::http::Proxy-Auto-Detect(lihat apt.confhalaman manual). Perilaku mirip dengan yang tidak berdokumen lama Acquire::http::ProxyAutoDetect(perhatikan ada / tidak adanya tanda hubung dalam opsi konfigurasi baru / lama), sebagian besar kompatibel secara mundur, tetapi telah diperpanjang ...

Saya sedang dalam proses mengajukan tambalan kepada pengelola apt untuk meningkatkan dokumentasi, tetapi karena ini tidak mungkin untuk membuatnya menjadi versi apt yang dikirimkan dengan rilis distro untuk beberapa waktu, saya akan memasukkan teks dari patch yang diusulkan di sini:

Acquire::http::Proxy-Auto-Detectdapat digunakan untuk menentukan perintah eksternal untuk menemukan proxy http yang akan digunakan. APT dapat memanggil perintah beberapa kali, dan akan memberikan URI ke perintah sebagai parameter pertama dan satu-satunya. APT mengharapkan perintah untuk menampilkan proxy yang akan digunakan untuk menghubungi URI yang bersangkutan di stdout sebagai satu baris dalam style http://proxy:port/, atau kata DIRECTjika proxy tidak boleh digunakan. Tidak ada output yang menunjukkan bahwa pengaturan proxy generik harus digunakan.

Perhatikan bahwa deteksi otomatis tidak akan digunakan untuk host jika konfigurasi proxy khusus host sudah ditetapkan via Acquire::http::Proxy::HOST.

Untuk mendiagnosis interaksi dengan perintah eksternal, setel Debug::Acquire::http=yesdan / atau Debug::Acquire::https=yesmis. Menggunakan -oparameter baris perintah.

Catatan yang menggunakan versi pra-rilis apt, versi 1.3 ~ exp2 ke 1.3 kemudian ada bug (kemungkinan diperbaiki oleh 1.3.1) yang menyebabkan apt untuk mengurai stderr dari perintah eksternal bersama dengan stdout.

Tim Small
sumber
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

Garis komando

  • Perlu ncberfungsi ( sudo apt-get install netcat) jika hilang.
  • Pastikan Anda chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Gunakan jalur lengkap saat menentukan skrip.

Bagaimana itu bekerja

Jika itu dapat terhubung ke proxy, itu mencetak proxy keluar APT menggunakannya. Jika tidak bisa, ia akan mencetak chug LANGSUNG dan APT secara normal.

saus

Luke Mlsna
sumber