子 shell 无法把代理导出回 Perl
直接设置 Perl 的 ENV,并用 local 把代理变量限制在一次子进程调用周围,之后原有值会恢复。
包含 export 的反引号命令只改变为该命令创建的那个 shell。shell 退出后,父 Perl 进程仍然保留之前的环境。
改用 Perl 的环境哈希来设置。local 可以把改动限制在一个块内:
{
local $ENV{http_proxy} = 'http://proxy.example:8080';
local $ENV{https_proxy} = 'http://proxy.example:8080';
my $status = system {
'/usr/bin/curl'
} '/usr/bin/curl', '--fail', '--max-time', '30',
'https://downloads.example/data.csv';
die "Downloader failed: $status" if $status != 0;
}
子进程继承这些局部化的值。对于公开的 HTTP 下载,可以用 HTTP 代理列表中的端点来提供这些 URL 值。块结束时,Perl 会恢复之前的条目,包括它们原本并不存在的情况。显示的 system 结果是 Perl 的进程状态,而不是解码后的 HTTP 响应码。
local 是动态作用域:在该块内调用的其他 Perl 代码同样能看到这个临时环境。它不是按函数隔离的私有凭证存储。
检查所选客户端继承到的大写变量和 bypass 变量。使用哪些输入由下载器决定。代理设置也不会改变进程的用户身份,更不必仅仅为了被继承而单独开一个 root shell。