利用できないプロキシを無視するにはどうすればよいですか?


15

LANで適切なダウンロードをキャッシュする最善の方法の指示に従ってください、ローカルネットワークにキャッシュプロキシを設定しました。そのマシンは常に稼働しているわけではないため、ソースリストを更新し、使用できない場合はそのプロキシを使用せずにパッケージをインストールできるようにしたいと思います。

のマニュアルページの「グループ取得」セクションをすでに読んでいますがapt.conf(5)、「サイレントフェイル」のようなオプションが見つかりませんでした。

現時点では、sudo apt-get update接続を確立できなかったため、関連するコマンドは失敗します。プロキシが利用できない場合、プロキシが無視されるようにクライアントを設定するにはどうすればよいですか?


zeroconfディスカバリーを使用していますか、または各クライアントでプロキシを手動で設定しますか?
ホルヘカストロ

ファイアウォール/ブロードキャストが無効になっている可能性があるため、プロキシを手動で設定しています。
レケンステイン

回答:


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か?
ガースキッド

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-Detectapt.confmanページを参照)。動作は、文書化されていない古いものに似ていますAcquire::http::ProxyAutoDetect(新しい/古い構成オプションにハイフンが存在するかどうかに注意してください)。

私はドキュメンテーションを改善するためにaptメンテナーにパッチを提出していますが、これはかなり長い間ディストリビューションのリリースが同梱されているaptのバージョンにはなりそうにないので、ここに提案されたパッチ:

Acquire::http::Proxy-Auto-Detect使用するHTTPプロキシを検出する外部コマンドを指定するために使用できます。APTはコマンドを複数回呼び出し、最初の唯一のパラメーターとしてコマンドにURIを渡します。APTは、問題のURIをスタイルの単一行としてhttp://proxy:port/、またはDIRECTプロキシを使用しない場合はword として、問題のURIに接続するために使用されるプロキシを出力するコマンドを予期します。出力は、汎用プロキシ設定を使用する必要があることを示しています。

ホスト固有のプロキシ設定がを介して既に設定されてAcquire::http::Proxy::HOSTいる場合、ホストに対して自動検出は使用されないことに注意してください。

外部コマンドとの相互作用を診断するには、コマンドラインパラメーターを設定Debug::Acquire::http=yesまたはDebug::Acquire::https=yes使用し-oます。

aptのプレリリースバージョン、バージョン1.3〜exp2から1.3を使用している場合、外部コマンドのstderrをstdoutとともに解析するバグ(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.