1. ホーム
  2. スクリプト・コラム
  3. その他

LAN設定用自動設定スクリプトファイルの書き方・使い方

2022-02-07 19:27:18
深圳大学に友人がいるため、彼らの学校のネットワークはかなり変態的である。教育ネットワークから割り当てられた無料IP以外のIPにアクセスすると、1Mあたり6RMBもかかる。 
セカンダリープロキシーとかを教えてあげたかったのですが、彼女には難しすぎましたね。 
まず、自動設定スクリプトファイルから見ていきましょう。 
IEを開き、[ツール]-[インターネットオプション]-[LAN設定]をクリックすると、[自動構成スクリプトを使用]が表示されます。 
自動設定スクリプトが行うことは、IEがWebページにアクセスする際に、スクリプトファイル内で定義された内容に基づいてアクセスすることです。例えば、スクリプトファイル内で、あるプロキシを使用している一部のIPへのアクセスを制限し、別のプロキシを使用している他のIPにアクセスする場合、スクリプトファイルを通して簡単に行うことができます。 
PACファイルは実際にはテキストファイルであり、最も単純な形式はFindProxyForURLというJScript関数を含むことです。IE は、ユーザーが閲覧しているアドレス URL のフルパスと、その URL のホスト名部分 (ホスト) の 2 つの変数を渡すことで、この関数を呼び出します。 
このFindProxyForURL関数の戻り値は3つあります。1つは "DIRECT" で、これはプロキシを介さない直接接続です;2つは "PROXY proxyaddr:port" で、proxyaddr と port はそれぞれプロキシのアドレスとポート;3つは "SOCKS socksaddr.Port; です。 port" で、socksaddr と port はそれぞれ socks proxy のアドレスとポートです。自動プロキシファイルは、複数の選択肢を組み合わせて、セミコロン(;)で区切って記述することも可能です。 
関数 FindProxyForURL(url,host) 

if (host == "www.mydomain.com") 
return "DIRECT"。 
return "PROXY myproxy:80; 
PROXY myotherproxy:8080; 
DIRECT"。 

以下、プロキシスクリプトで使用する可能性のある関数と説明です(英語が苦手な方は、そのまま応用編まで読み飛ばしてください)。 
PACヘルパー関数 
dnsDomainIs(host, domain) ホストが指定されたドメインの一部であればtrueを、そうでなければfalseを返します。 
isInNet(hostname, ホスト名とサブネットのIP、サブネットマスクを解決) ホスト名がサブネット内にある場合、真を返します。 
IPアドレスとサブネットマスクで指定され、そうでない場合は偽となります。 
isPlainHostName(host) ホスト名にドットがなければ真を,なければ偽を返します。 
isResolvable(host) Internet ExplorerがDNSを通してホスト名の解決を試み、成功すればtrueを、そうでなければfalseを返す。 
localHostOrDomainIs ホストが (host, domain) ドメインのホスト部分に一致する場合、またはホストが (local domain の URL に対してのみ実行されます) のホスト部分とドメイン部分に一致する場合に true を返します。 
dnsDomainLevels(host) ホスト名に含まれるドットの数を返します。 
dnsResolve(host) 指定されたホストの IP アドレスを含む文字列を返します。 
myIPAddress( ) ローカルマシンの IP アドレスを含む文字列を返します。 
shExpMatch(url, shexp) 与えられたURLが指定されたシェル式にマッチする場合に真を、そうでない場合に偽を返します。 
dateRange(parmList) 現在の日付がparmListで指定された日付に含まれる場合に真を、そうでない場合に偽を返します。 
timeRange(parmList) 現在時刻がparmListで指定された時刻に含まれる場合はtrue、そうでない場合はfalseを返します。 
weekdayRange(parmList) 今日がparmListで指定された曜日内であればtrueを、そうでなければfalseを返します。 
各関数の応用例として、以下のようなものがあります。 
著者: xmudahai 2006-10-17 00:33 この発言に返信する 
--------------------------------------------------------------------------------
2 自動設定スクリプトファイルの書き方・使い方(オリジナル) 
a. isPlainHostName(host)、この例は、http://myservername/ のようなローカルホストかどうかを判断するために実証しています。 
直接接続の場合はアクセス方法、そうでない場合はプロキシを使用する 
関数 FindProxyForURL(url, host) 

if (isPlainHostName(host)) 
return "DIRECT"。 
その他 
return "PROXY proxy:80"; 

bのdnsDomainIs(ホスト、"")、localHostOrDomainIs(ホスト、"")、この例は、アクセスホストがドメインとドメイン名、ホスト名に属しているかどうかを判断することを示しています場合は、会社。comと直接接続用のホーム.com社ではない、その他のプロキシアクセス使用されます。 
関数 FindProxyForURL(url, host) 

if ((isPlainHostName(host) ││) 
dnsDomainIs(host, ".company.com")) && 
!localHostOrDomainIs(host, "www.company.com") && 
!localHostOrDomainIs(host, "home.company.com"))) 
return "DIRECT"。 
その他 
return "PROXY proxy:80"; 

c. isResolvable(host), この例は、ホスト名がDNSサーバーで解決できるかどうかを示し、直接アクセスできる場合は、プロキシを通してアクセスすることになります。 
関数 FindProxyForURL(url, host) 

if (isResolvable(host)) 
return "DIRECT"。 
その他 
return "PROXY proxy:80"; 

d. isInNet(host, "", ""), この例は、アクセスIPが特定のサブネット内にあるかどうかを示し、もしそうなら、直接アクセスし、そうでなければプロキシを経由します。 
関数 FindProxyForURL(url, host) 

if (isInNet(host, "166.111.0.0", "255.255.0.0")) 
return "DIRECT"。 
その他 
return "PROXY proxy:80"; 

e. shExpMatch(host, ""), この例は、ホストドメインに基づいて接続タイプを変更し、localhost, *.edu, *.com に対してそれぞれ異なる接続を行うことを示しています。 
関数 FindProxyForURL(url, host) 

if (isPlainHostName(host)) 
return "DIRECT"。 
else if (shExpMatch(host, "*.com")) 
return "PROXY comproxy:80"。 
else if (shExpMatch(host, "*.edu")) 
return "PROXY edup}. 
f. url.substring(), この例は、異なるプロトコルに基づいた異なるプロキシを選択することを示しています。 
関数 FindProxyForURL(url, host) 

if (url.substring(0, 5) == "http:") { 
return "PROXY proxy:80"; 

else if (url.substring(0, 4) == "ftp:")。{ 
return "PROXY fproxy:80"。 

else if (url.substring(0, 7) == "gopher:")。{ 
return "PROXY gproxy"; 

else if (url.substring(0, 6) == "https:") { 
return "PROXY secproxy:8080"; 

else { 
return "DIRECT"。 


g. dnsResolve(host), この例は、アクセスするホストが特定のIPであるかどうかを判断し、もしそうならプロキシを使い、そうでなければ直接接続することを示している。 
unction FindProxyForURL(url, host) 

if (dnsResolve(host) == "166.111.8.237")。{ 
return "PROXY secproxy:8080"; 

else { 
return "PROXY proxy:80"; 


h. myIpAddress(), この例は、ローカルIPが特定のIPであるかどうかを判断し、もしそうならプロキシを使用し、そうでなければ直接接続を使用することを示しています。 
関数 FindProxyForURL(url, host) 

if (myIpAddress() == "166.111.8.238") { 
return "PROXY proxy:80"; 

else { 
return "DIRECT"。 


i. dnsDomainLevels(host), この例は、ホストにアクセスするドメイン名のレベル、つまり、ドメイン名のポイント数を示しています ドメイン名にポイントがある場合、それはプロキシを介してアクセスされ、それ以外の場合は直接接続されています. 
関数 FindProxyForURL(url, host) 

if (dnsDomainLevels(host) > 0) { // ホストのドットの数 > 0 の場合 
return "PROXY proxy:80"; 

return "DIRECT"。 

j. weekdayRange()は、この例では、プロキシを使用して変更するには、現在の日付の範囲は、それがGMT水曜日から土曜日の場合は、接続するプロキシを使用して、それ以外の場合は直接接続することを示しています。 
関数 FindProxyForURL(url, host) 

if(weekdayRange("WED", "SAT", "GMT")). 
return "PROXY proxy:80"; 
その他 
return "DIRECT"。 

k. 最後の例は、プロキシサーバーをうまく利用できるように、プロキシのランダムな利用を実証しています。 
関数 FindProxyForURL(url,host) 

return randomProxy(); 

関数 randomProxy() 

switch( Math.floor( Math.random() * 5 ) ) 

の場合、0。 
return "PROXY proxy1:80"; 
を壊してください。 
の場合、1. 
return "PROXY proxy2:80"; 
を壊してください。 
の場合、2. 
return "PROXY proxy3:80"; 
を壊します。 
の場合、3. 
return "PROXY proxy4:80"; 
を壊してください。 
の場合、4. 
return "PROXY proxy5:80"; 
を壊してください。 


以上の関数と命令例を利用すれば、より複雑で効果的な自動プロキシスクリプトを書くことができる。