首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在网络连接上自动更新$http_proxy变量系统?

如何在网络连接上自动更新$http_proxy变量系统?
EN

Unix & Linux用户
提问于 2021-05-10 00:49:56
回答 2查看 979关注 0票数 0

有时候我需要把手机拴起来。问题是,当我这样做时,使用一个随机的私有IP作为网络网关。谷歌似乎认为他们拥有你的手机,而不是你,所以我对这种行为没有太多的控制权。此外,我在上面运行代理应用程序。我想要做的是自动设置它。

我有以下脚本:

代码语言:javascript
复制
#!/usr/bin
router=$(route -n | awk '{print $2}' | grep 192.168)
sed "s/\[PROXY-IP\]/$router/g" ~/pac/wpad.template > ~/pac/wpad.dat
export http_proxy="http://$router:8080"
export https_proxy="https://$router:8080"
export ftp_proxy="http://$router:8080"

但是,当我检查env变量时,它们还没有被设置,但是wpad.dat已经更新了。所以我知道剧本在运行。

我了解到shell脚本不访问system变量。只是当地的副本。有没有办法在系统范围内设置这些变量?我能找到的唯一建议是每次网络改变时都需要重新启动。这会带来很大的干扰。基本上将脚本硬编码到.bashrc中

我已经查看了源代码命令,但这似乎只适用于任何称为脚本的命令。更改不会向上传播到系统和用户变量。我不知道他们是如何做到的,因为无论什么源称为脚本,脚本都会在它自己的本地环境变量副本上运行。

EN

回答 2

Unix & Linux用户

发布于 2021-05-10 07:58:53

对于Firefox这样的GUI浏览器来说,更新WPAD文件应该很好(假设它们被配置为使用它)。

命令行工具(如lynxwgetcurl )要难得多:

  • 他们不能使用PAC或WPAD文件
  • 您甚至不能更改进程父进程中的环境变量,更不用说全局更改了。
  • 而且,当文件发生变化时,也无法告诉shell重新创建文件。

不过,<#>是一种执行最后一项的方法。至少在bash。您可以使用PROMPT_COMMAND变量告诉bash每次显示shell提示符时都要源脚本。例如:

修改脚本,以便将*_proxy变量设置输出到文件,例如/var/tmp/proxy-settings.sh。使用chmod a+r确保该文件具有世界可读性。

类似于:

代码语言:javascript
复制
cat <<__EOF__ > /var/tmp/proxy-settings.sh
export http_proxy="http://$router:8080"
export https_proxy="https://$router:8080"
export ftp_proxy="http://$router:8080"
EOF

然后编写一个shell脚本,如果该文件已经更改,则将其保存为例如/usr/local/bin/update-proxy-vars.sh。同样,这应该是单词可读的(chmod a+r)。它不需要是可执行的,因为它将是源的,而不是执行的:

代码语言:javascript
复制
# each individual shell needs it's own timestamp, because each one will
# read the proxy settings file at different times.
mkdir -p /tmp/.proxy-timestamps

tsfile="/tmp/.proxy-timestamps/time/var/tmp/proxy-settings.sstamp.$"
if [ -e "$tsfile" ] ; then
  timestamp=$(< "$tsfile")
fi

# get the timestamp of the proxy-settings.sh file
# not all versions of `stat` can do this, and those that do
# have different and incompatible options.  The following works
# for GNU `stat`.
proxy_timestamp=$(stat -c %Y /var/tmp/proxy-settings.sh)

# has the timestamp changed?  if so, source the file.
if [ "$timestamp" != "$proxy_timestamp" ] ; then
  . /var/tmp/proxy-settings.sh
  echo "$proxy_timestamp" > "$tsfile"
fi

最后,在每次显示提示符时将PROMPT_COMMAND设置为源脚本。

代码语言:javascript
复制
PROMPT_COMMAND='. /usr/local/bin/update-proxy-vars.sh'

您还应该在~/. bash _logout脚本中运行rm -f /tmp/.proxy-timestamps/timestamp.$,以便在bash exits.just中清理

这是个丑陋和讨厌的黑客,它减慢了bash的速度(这并不是速度恶魔),因为它每次显示提示符时都必须运行update-proxy-vars.sh。每次你运行一个命令。或者在没有命令的情况下按回车。每一个提示符,都必须运行这个脚本,读取时间戳文件,运行stat,比较时间戳,如果时间戳发生了更改,它可能还会生成另一个文件。

如果存在的话,每次只源/var/tmp/proxy-settings.sh可能会更快,不管它是否已经更改,而不用费心使用时间戳。

只需设置:

代码语言:javascript
复制
PROMPT_COMMAND='[ -e /var/tmp/proxy-settings ] && . /var/tmp/proxy-settings.sh'

但它起作用了,这是主要的事情,对吗?

或者,您可以养成这样的习惯:在需要时,在每个需要它的shell中手动创建一个像/var/tmp/proxy-settings.sh这样的文件。

您可能也可以在其他shell中使用$PS1变量(如ashdashzshksh等)进行同样的操作。但是这个使用PROMPT_COMMAND的版本很难看,也够麻烦的了。用PS1做这件事会更糟。

票数 1
EN

Unix & Linux用户

发布于 2021-05-10 02:17:14

您必须源-调用您的文件(文件调用之前的点):。./myfile.sh

Normaly文件只获取父环境的一个副本,并且在关闭后,子进程在环境中的会话chnces将丢失。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/648990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档