/etc/hosts 内の名前による名前解決

/etc/hosts 内の名前による名前解決

Fedora 19 ボックスからさまざまな Web プロキシを介して Web サイトのパフォーマンスをチェックする必要があります。そのためには、ファイル内のプロキシの DNS 解決名にローカルで解決可能な名前「proxy」を設定します/etc/hosts。したがって、ファイルの内容は/etc/hosts次のようになります。

proxy.us.company.com    proxy
#proxy.eu.company.com    proxy
#proxy.sa.company.com    proxy

その後、別のプロキシをテストする必要がある場合は、ファイルを編集し/etc/hostsて別のプロキシ DNS 名のコメントを解除するだけで、すべてのログイン (および私のマシンを使用している他のすべてのユーザー) が新しいプロキシに対してチェックされます。また、上記の DNS 名のほとんどはラウンドロビン エントリであり、これも問題なく、テストに必要です。(実を言うと、実際の作業でもこれが必要です。時々 proxy.us が遅くなり、他のプロキシの 1 つが proxy.us よりも速くなることがあるためです。)

これをどうやって実行すればいいのでしょうか? env 変数を変更するスクリプトを書くことを検討しましたhttp_proxyが、その方法では、ログインのすべての変数を揃えるために、すべてのプロセスに追加の手順を追加する必要があります。 1 か所だけ変更したいです。/etc/hostsシステム全体の名前解決の変更をこのように行う最も論理的な場所のようです。

答え1

/etc/hosts は名前を IP アドレスにマップするだけです。名前を別の名前にポイントすることはできません。

/etc/hosts を引き続き使用することもできますが、名前を IP に解決し、その IP で /etc/hosts を変更するスクリプトを作成するか、事前に作業を行って複数の hosts ファイルを作成し、スクリプトでチェックの適切な時点で各プロキシのファイルを所定の場所に移動するだけです。

答え2

これは実行できません。私が望むことを行うための最善の解決策は、名前リゾルバ (bind、named) をインストールし、プロキシの FQDN を使用してローカル テーブルを更新することです。

答え3

必要なことを実行する Python スクリプトは次のとおりです。

#!/usr/bin/env python
from dns.resolver import Resolver
from re import sub
hostsfile='/etc/hosts'
proxies = [
    'proxy.us.company.com',
    'proxy.eu.company.com',
    'proxy.sa.company.com'
]
name = 'proxy'

def main():
    proxy = menu('Select proxy:', proxies)
    ip = Resolver().query(proxy,'A')[0].to_text()
    if len(ip):
        with open(hostsfile, 'r') as h:
            hosts = h.read()
        with open(hostsfile, 'w+') as h:
            hosts = sub('((\n|(?<!\n)\.)(1?\d?\d|2[0-4]\d|25[0-5])){4} +'+name+'(?= *\n)', '\n'+ip+' '+name, hosts)
            h.write(hosts)

def getInt(question, min, max):
    min,max = [int(max),int(min)] if min>max else [int(min),int(max)]
    while True:
        try:
            answer = int(raw_input('{0}: '.format(question)))
            if min <= answer <= max:
                return answer
            print('Must be a number from {0} to {1}'.format(min,max))
        except ValueError:
            print('Not a valid number')

def menu(title, items, index=False):
    print(title)
    for i, item in enumerate(items):
        print('{0}. {1}'.format(i+1, item))
    answer = getInt('', 1, len(items)) - 1
    return answer if index else items[answer]

main()

関連情報