有时候我需要把手机拴起来。问题是,当我这样做时,使用一个随机的私有IP作为网络网关。谷歌似乎认为他们拥有你的手机,而不是你,所以我对这种行为没有太多的控制权。此外,我在上面运行代理应用程序。我想要做的是自动设置它。
我有以下脚本:
#!/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中
我已经查看了源代码命令,但这似乎只适用于任何称为脚本的命令。更改不会向上传播到系统和用户变量。我不知道他们是如何做到的,因为无论什么源称为脚本,脚本都会在它自己的本地环境变量副本上运行。
发布于 2021-05-10 07:58:53
对于Firefox这样的GUI浏览器来说,更新WPAD文件应该很好(假设它们被配置为使用它)。
命令行工具(如lynx、wget或curl )要难得多:
不过,<#>是一种执行最后一项的方法。至少在bash。您可以使用PROMPT_COMMAND变量告诉bash每次显示shell提示符时都要源脚本。例如:
修改脚本,以便将*_proxy变量设置输出到文件,例如/var/tmp/proxy-settings.sh。使用chmod a+r确保该文件具有世界可读性。
类似于:
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)。它不需要是可执行的,因为它将是源的,而不是执行的:
# 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设置为源脚本。
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可能会更快,不管它是否已经更改,而不用费心使用时间戳。
只需设置:
PROMPT_COMMAND='[ -e /var/tmp/proxy-settings ] && . /var/tmp/proxy-settings.sh'但它起作用了,这是主要的事情,对吗?
或者,您可以养成这样的习惯:在需要时,在每个需要它的shell中手动创建一个像/var/tmp/proxy-settings.sh这样的文件。
您可能也可以在其他shell中使用$PS1变量(如ash、dash、zsh、ksh等)进行同样的操作。但是这个使用PROMPT_COMMAND的版本很难看,也够麻烦的了。用PS1做这件事会更糟。
发布于 2021-05-10 02:17:14
您必须源-调用您的文件(文件调用之前的点):。./myfile.sh
Normaly文件只获取父环境的一个副本,并且在关闭后,子进程在环境中的会话chnces将丢失。
https://unix.stackexchange.com/questions/648990
复制相似问题