はじめに
ごりごりにシェルスクリプトがかけるわけではありません。おかしなところは指摘していただけると幸いです。
作ろうと思った経緯
実は大学生しているんですが、研究室のネットワークにはプロキシが設定されており、git使ったり、apt使ったりなんなりでいちいち設定を切り替えたりするのが非常に面倒でここですべてのやる気がなくなります。zshにhook関数を登録することで、コマンドライン上で何かの処理を行う前に、接続中のSSIDからプロキシ設定の有無を検知してプロキシの設定ファイルの内容の変更処理をかけます。
必要なもの
SSIDの検知にはnetwork-manager
を使用します。筆者の環境では標準インストールされていましたが、ない場合は以下を実行してください。
sudo apt install network-manager
作成したもの
ソースコード類
シェルスクリプト
changer.sh
#!/bin/zsh
function suggest_gnome() {
echo -e -n "\e[33m[Warning] If you do not change this setting, you may not be able to use your browser or other services.\e[m\nDo you want to change the manual proxy settings?[Y/n]: "
for i in `seq 1 5`
do
read yn
if [ $yn = "Y" ] || [ $yn = "y" ]
then
gnome-control-center
break
elif [ $yn = "N" ] || [ $yn = "n" ]
then
echo "To change the setting, go to 'Settings'>'Network'>'Network Proxy'."
break
else
echo -e -n "\e[31m[ERROR]Input [Y/n]: \e[m"
fi
done
}
function connect_to_proxy() {
export ALL_PROXY=http://proxyserver:port
export http_proxy=http://proxyserver:port
export https_proxy=https://proxyserver:port
export HTTP_PROXY=http://proxyserver:port
export HTTPS_PROXY=https://proxyserver:port
sudo cp -f $HOME/proxy-change/configure_files/apt.conf.lab /etc/apt/apt.conf
sudo cp $HOME/proxy-change/configure_files/config.lab ~/.ssh/config
sudo cp $HOME/proxy-change/configure_files/curlrc.lab ~/.curlrc
sudo cp -f $HOME/proxy-change/configure_files/wgetrc.lab /etc/wgetrc
sudo npm -g config set proxy $http_proxy
sudo npm -g config set https-proxy $https_proxy
sudo npm -g config set registry "http://registry.npmjs.org/"
}
function disconnect_from_proxy() {
sudo rm -f /etc/apt/apt.conf
sudo cp -f $HOME/proxy-change/configure_files/config.others ~/.ssh/config
sudo rm ~/.curlrc
sudo cp -f $HOME/proxy-change/configure_files/wgetrc.others /etc/wgetrc
sudo npm -g config delete proxy
sudo npm -g config delete https-proxy
sudo npm -g config delete registry
unset ALL_PROXY
unset HTTP_PROXY
unset HTTPS_PROXY
unset http_proxy
unset https_proxy
}
function network_hook() {
SSID= "{WiFiのSSIDを入力}"
FLAGRC_LINE_NUM=`sed -n '/IS_PROXY/=' $HOME/proxy-change/.flagrc`
FLAGRC_LINE=`cat $HOME/proxy-change/.flagrc | grep "IS_PROXY"`
IS_SSID_IN=`timeout 10 nmcli dev wifi | grep $SSID | grep "*"`
CMD_STATE=`echo $?`
if [ $CMD_STATE = "0" ]
then
LINE_STATE=`echo $FLAGRC_LINE | grep true`
if [ -z "$LINE_STATE" ]
then
suggest_gnome
connect_to_proxy
sed -i ${FLAGRC_LINE_NUM}d $HOME/proxy-change/.flagrc && echo "IS_PROXY=true" >> $HOME/proxy-change/.flagrc
echo -e "\e[32m[PROXY WAS CHANGED]\e[m"
fi
else
LINE_STATE=`echo $FLAGRC_LINE | grep false`
if [ -z "$LINE_STATE" ]
then
suggest_gnome
disconnect_from_proxy
sed -i ${FLAGRC_LINE_NUM}d $HOME/proxy-change/.flagrc && echo "IS_PROXY=false" >> $HOME/proxy-change/.flagrc
echo -e "\e[32m[PROXY WAS CHANGED]\e[m"
fi
fi
}
autoload -Uz add-zsh-hook
add-zsh-hook preexec network_hook
プロキシの更新状態を保持するための.flagrc
ファイル
.flagrc
IS_PROXY=false
解説
ざっくりとした処理の説明
-
add-zsh-hook preexec network_hook
でnetwork_hook関数をエンターを押す直前に実行します。 - .flagrcのプロキシ設定が適用されているかどうか記載されている行番号とその内容を変数に格納します。
-
nmcli
コマンドで目的のSSID内にいるかどうかを判定します。 -
.flagrc
の内容次第でプロキシ設定の処理を行います。主にファイル置換と環境変数の設定を行っています。 - 環境変数でプロキシを設定するだけではchromeやSlackが使用できなかったため、
gnome-control-center
でUbuntuの設定アプリケーションを開くようにしています。
※各種設定ファイルの記述方法内容は各自でお調べください。
最後に
わりと作り込みが甘かったので気が向いたらもう少しマシな処理を組みます。