我在使用代理的网络中。我的机器到处使用大量脚本,通过 HTTP 相互访问。
- 网络是10.0.0.0/8。
我的代理是10.1.1.1:81,所以我进行了相应的设置:
export http_proxy=http://10.1.1.1:81/
我想排除我自己的范围以通过代理访问。我尝试了任何可用的组合。
export no_proxy='10.*' export no_proxy='10.*.*.*' export no_proxy='10.0.0.0/8'
以上都不起作用!
我正在测试wget
,它总是尝试查询代理,无论我想连接到哪个 IP 地址。
- 由于许多脚本遍布所有系统中的任何地方,因此该
--no-proxy
选项实际上不是一个选项。我想在系统范围内设置它。
答案1
你看问题的方式是错误的。环境no_proxy
变量列出域后缀,而不是前缀。从文档:
no_proxy
:此变量应包含以逗号分隔的域扩展代理列表不是用于.
因此对于 IP,您有两种选择:
1)完整添加每个IP:
printf -v no_proxy '%s,' 10.1.{1..255}.{1..255};
export no_proxy="${no_proxy%,}";
2) 重命名wget
为wget-original
并编写一个包装器脚本(称为wget
),用于查找给定 URL 主机的 IP,并确定是否应使用代理:
#!/bin/bash
ip='';
for arg; do
# parse arg; if it's a URL, determine the IP address
done;
if [[ "$ip" =~ ^10\.1\. ]]; then
wget-original --no-proxy "$@";
else
wget-original "$@";
fi;
答案2
info wget
说:
`no_proxy'
This variable should contain a comma-separated list of domain
extensions proxy should _not_ be used for. For instance, if the
value of `no_proxy' is `.mit.edu', proxy will not be used to
retrieve documents from MIT.
所以变量应该包含一个列表域, 不是IP范围。您需要在/etc/hosts
文件中为本地计算机设置正确的本地别名。
除此之外,请记住设置环境变量并不保证将或不会使用代理。这只是一个信息可能由支持它的程序使用。
答案3
不完全是正确的解决方案,但它可能会为您解决问题。如果您假设从代理外部访问任何内容将使用 DNS 名称而不是直接使用 IP 地址,则可以将其设置为:
export no_proxy=0,1,2,3,4,5,6,7,8,9
据我所知,没有顶级域名以数字结尾,所以如果有的话,它一定是一个IP地址。
答案4
no_proxy
似乎与至少两个字符的主机的尾部部分相匹配,因此no_proxy
包含 ipv4 的 100 个尾部部分的设置将跳过任何 ipv4 url
printf -v no_proxy '%s,' {10..99}
export no_proxy=".0,.1,.2,.3,.4,.5,.6,.7,.8,.9,$no_proxy"
curl -v http://any-ip/