ネットワーク接続でシステム全体の$http_proxy変数を自動的に更新する方法は?

ネットワーク接続でシステム全体の$http_proxy変数を自動的に更新する方法は?

時には電話で接続する必要があります。問題は、これを行うときに任意のプライベートIPをネットワークゲートウェイとして使用することです。 Googleはあなたではなく、自分が自分の携帯電話を所有していると思うようです。したがって、私はこれらの行動を制御することはできません。また、プロキシアプリケーションを実行します。私がしたいのは自動的に設定することです。

次のスクリプトがあります。

#!/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"

ところで、環境変数を確認してみると、まだ設定されていませんが、wpad.datが更新されています。だから、スクリプトが実行されたことを知っています。

シェルスクリプトはシステム環境変数にアクセスしないことを学びました。ただローカルコピーです。これらの変数をシステム全体で設定する方法はありますか?私が見つけることができる唯一のアドバイスは、ネットワークが変更されるたびに再起動する必要があることです。これは非常に有害です。デフォルトでは、スクリプトを.bashrcにハードコードします。

ソースコマンドを見ましたが、これはいわゆるスクリプトでのみ機能するようです。これらの変更はシステムとユーザー変数に伝播されません。スクリプトを呼び出すすべてのソースは、環境変数の独自のローカルコピーで実行されるため、どのように実行するのかわかりません。

答え1

WPADファイルの更新は、FirefoxなどのGUIブラウザで正しく機能します(使用するように設定されていると仮定)。

lynxまたははるかに難しいwgetコマンドラインツール:curl

  • PAC または WPAD ファイルは使用できません。
  • グローバルには言うまでもなく、プロセスの親内で環境変数を変更することもできません。
  • また、ファイルが変更されたときにファイルをリソースとして指定するようにシェルに指示する方法はありません。

そこを除いてはい最後の項目を完成する方法。bash少なくとも。 PROMPT_COMMAND変数を使用して、シェルプロンプトがbash表示されるたびにスクリプトをインポートするように指示できます。たとえば、

*_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

次に、ファイルをインポートし(変更された場合)、次のように保存するシェルスクリプトを作成します/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'

また、rm -f /tmp/.proxy-timestamps/timestamp.$$bashが終了したときにクリーンアップするには、~/.bash_logoutスクリプトを実行する必要があります。

私の考えでは、これは醜くて迷惑なハッキングであり、プロンプトが表示されるたびに実行する必要があるため、速度が遅くなりますbash(最初は速度悪魔ではありません)。update-proxy-vars.shコマンドが実行されるたびに。または、コマンドを入力せずにEnterキーを押すだけです。メッセージが表示されるたびにこのスクリプトを実行し、タイムスタンプファイルを読み取り、実行し、タイムスタンプをstat比較し、タイムスタンプが変更された場合は別のファイルをインポートする必要があります。

/var/tmp/proxy-settings.sh変更の有無にかかわらず、毎回(存在する場合)ソースを取得し、タイムスタンプを心配しない方が速い場合があります。

ただ設定してください:

PROMPT_COMMAND='[ -e /var/tmp/proxy-settings ] && . /var/tmp/proxy-settings.sh'

しかし、それは効果があり、それがすべてです。そうですか?

/var/tmp/proxy-settings.shあるいは、ファイルが必要なすべてのシェルと同じように、手動でファイルをインポートすることを覚えている習慣があります。

$PS1この変数(たとえばash、、、、dashなどzsh)を使用して、他のシェルでksh同じ操作を実行できます。ただし、PROMPT_COMMANDを使用するこのバージョンは十分に見苦しく、ハッキング的です。そうする方がPS1悪いでしょう。

答え2

ファイルに対してソース呼び出しを実行する必要があります(ファイル呼び出し前のポイント)。 。 ./myfile.sh

通常、ファイルは親環境のコピーのみを取得し、環境の子プロセスのセッション機会を閉じた後に失われます。

関連情報