我在@Wilmar 评论后找到了解决方案,他指出了here(谢谢!)。
应用程序可以通过发送“http://wpad/wpad.dat”来自动查找它是否在代理后面。
如果代理服务器落后,它会回复一条消息,其中包含带有代理详细信息的 PAC 文件。然后,应用程序可以提取任何所需设置的代理详细信息。这就是 Chrome 自动设置代理的方式。
在 windows 中使用 wget 查找代理详细信息的示例
在 Windows 中,您可以按如下方式使用 wget 来获取代理服务器的详细信息。必须从短信中提取详细信息,您可以使用 jrepl 之类的工具来完成此类任务。这里我只展示细节在哪里。
call wget "http://wpad/wpad.dat" -o "ProcessLog.txt" -O "PAC.txt"
这里有三种可能的情况:
- 如果后面没有代理,则 PAC.txt 为空,ProcessLog.txt 中包含与此类似的文本消息。
ProcessLog.txt
--2020-09-01 08:38:29-- http://wpad/wpad.dat
Resolving wpad (wpad)... failed: The requested name is valid, but no data of the requested type was found. .
wget: unable to resolve host address 'wpad'
- 万一后面有代理服务器,并且设置了代理的windows环境变量:
http_proxy=http://proxy.mc.company.com:777
https_proxy=https://proxy.mc.company.com:777
然后 wget 已经知道代理地址,因此 PAC.txt 为空,并且 ProcessLog.txt 包含类似于以下包含代理详细信息的文本消息。在此示例中,代理详细信息为 [proxy_ip]:[proxy_port] = proxy.mc.company.com:777
ProcessLog.txt
--2020-09-01 08:29:59-- http://wpad/wpad.dat
Resolving proxy.mc.company.com (proxy.mc.company.com)... 10.100.200.150
Connecting to proxy.mc.company.com (proxy.mc.company.com)|10.100.200.150|:777... connected.
Proxy request sent, awaiting response... 302 Found
Location: http://www.wpad.com/wpad.dat [following]
--2020-09-01 08:30:00-- http://www.wpad.com/wpad.dat
Connecting to proxy.mc.company.com (proxy.mc.company.com)10.100.200.150|:777... connected.
Proxy request sent, awaiting response... 403 Forbidden
2020-09-01 08:30:00 ERROR 403: Forbidden.
- 如果后面有代理服务器,但没有设置代理的 windows 环境变量,则 wget 从代理服务器获取代理详细信息。在这种情况下,PAC.txt 包含类似于以下包含代理详细信息的长文本消息。在此示例中,代理详细信息为 [proxy_ip]:[proxy_port] = proxy.mc.company.com:777
PAC.txt
function FindProxyForURL(url,host) {
var me=myIpAddress();
var resolved_ip = dnsResolve(host);
if (host == "127.0.0.1") {return "DIRECT";}
if (host == "localhost") {return "DIRECT";}
if (isPlainHostName(host)) {return "DIRECT";}
if (url.substring(0,37) == "http://lyncdiscoverinternal.company.com") {return "DIRECT";}
if (!resolved_ip) { if (url.substring(0,6) == "https:") {return "PROXY proxy-mc.company.com:778";} else {return "PROXY proxy-mc.company.com:777";}}
if (host == "moran-for-localhost-only.com") {return "DIRECT";}
...
...
在 windows 中简化使用 wget 查找代理详细信息
当使用 wget 查找代理详细信息时,我们可以使用标志 --no-proxy 命令它忽略代理环境变量(如果已设置)。这给我们留下了上述两种可能的情况(1)和(3)。所以我们只需要 ProxyInfo 文件。如果为空(场景 1),则后面没有代理,如果包含文本(场景 3),则在代理后面,您可以从中提取代理详细信息。
call wget --no-proxy "http://wpad/wpad.dat" -O "PAC.txt"