学校と自宅の両方でノートパソコンを使っていると、学校のネットワークではproxy設定をしないといけなくて、何気なくapt-get updateしてエラーめちゃくちゃでてビビる、という経験をすることがあります。今回はコマンド一つでaptの設定ファイル、シェルの環境変数などを書き換える簡単なシェルスクリプトを紹介します。
説明のため、プロキシはproxy.ac.jp、ポート番号は8080とします。各自の環境で読み替えてください。
使い方
使い方は
sudo chmod u+x proxy_toggle.sh
で実行権限を与えておいたとすると
proxy_toggle.sh on
でプロキシ設定オン、
proxy_toggle.sh off
でプロキシ設定オフです。パスワードの入力を求められます。
内容
aptの参照するファイルは/etc/apt/apt.confなので、そのファイルの中身を書き換えれば良いです。
また、おまじないに近いかもしれませんが、/etc/environmentを参照するものもあるらしいので、こちらも設定しておきます。
最後に、コマンド実行以後立ち上げるすべてのシェルでプロキシ設定を有効にするために、~/.bashrcまたは~/.zshrc等も書き換えます。
#!/bin/sh
HTTP_PROXY_HOST=proxy.ac.jp
HTTP_PROXY_PORT=8080
HTTPS_PROXY_HOST=proxy.ac.jp
HTTPS_PROXY_PORT=8080
shellrc=$HOME/.zshrc # .bashrc
if [ $# = 0 ]; then
echo "Error: no args"
exit 1
else
if [ $1 = "on" ]; then
sudo sed -i.bak '/http[s]::proxy/Id' /etc/apt/apt.conf
sudo sed -i.bak '/ftp::proxy/Id' /etc/apt/apt.conf
sudo tee -a /etc/apt/apt.conf <<EOF
Acquire::ftp::proxy "ftp://$HTTP_PROXY_HOST:$HTTP_PROXY_PORT/";
Acquire::http::proxy "http://$HTTP_PROXY_HOST:$HTTP_PROXY_PORT/";
Acquire::https::proxy "https://$HTTPS_PROXY_HOST:$HTTPS_PROXY_PORT/";
EOF
sudo sed -i.bak "/all_proxy/Id" /etc/environment
sudo sed -i.bak "/ALL_PROXY/Id" /etc/environment
sudo sed -i.bak "/http_proxy/Id" /etc/environment
sudo sed -i.bak "/HTTP_PROXY/Id" /etc/environment
sudo sed -i.bak "/https_proxy/Id" /etc/environment
sudo sed -i.bak "/HTTPS_PROXY/Id" /etc/environment
sudo sed -i.bak "/ftp_proxy/Id" /etc/environment
sudo sed -i.bak "/FTP_PROXY/Id" /etc/environment
sudo tee -a /etc/environment <<EOF
all_proxy="socks://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT/"
ALL_PROXY="socks://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT/"
http_proxy="http://$HTTP_PROXY_HOST:$HTTP_PROXY_PORT"
HTTP_PROXY="http://$HTTP_PROXY_HOST:$HTTP_PROXY_PORT"
https_proxy="http://$HTTPS_PROXY_HOST:$HTTPS_PROXY_PORT"
HTTPS_PROXY="http://$HTTPS_PROXY_HOST:$HTTPS_PROXY_PORT"
ftp_proxy="ftp://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT"
FTP_PROXY="ftp://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT"
EOF
sed -i.bak '/all_proxy/Id' $shellrc
sed -i.bak '/ALL_PROXY/Id' $shellrc
sed -i.bak '/http_proxy/Id' $shellrc
sed -i.bak '/HTTP_PROXY/Id' $shellrc
sed -i.bak '/https_proxy/Id' $shellrc
sed -i.bak '/HTTPS_PROXY/Id' $shellrc
sed -i.bak '/ftp_proxy/Id' $shellrc
sed -i.bak '/FTP_PROXY/Id' $shellrc
tee -a $shellrc <<EOF
export all_proxy="socks://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT/"
export ALL_PROXY="socks://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT/"
export http_proxy="http://$HTTP_PROXY_HOST:$HTTP_PROXY_PORT"
export HTTP_PROXY="http://$HTTP_PROXY_HOST:$HTTP_PROXY_PORT"
export https_proxy="http://$HTTPS_PROXY_HOST:$HTTPS_PROXY_PORT"
export HTTPS_PROXY="http://$HTTPS_PROXY_HOST:$HTTPS_PROXY_PORT"
export ftp_proxy="ftp://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT"
export FTP_PROXY="ftp://$HTTP_PROXY_HOST:$HTTPS_PROXY_PORT"
EOF
else
if [ $1 = "off" ]; then
sudo sed -i.bak "/http::proxy/Id" /etc/apt/apt.conf
sudo sed -i.bak "/https::proxy/Id" /etc/apt/apt.conf
sudo sed -i.bak "/ftp::proxy/Id" /etc/apt/apt.conf
sudo sed -i.bak "/all_proxy/Id" /etc/environment
sudo sed -i.bak "/ALL_PROXY/Id" /etc/environment
sudo sed -i.bak "/http_proxy/Id" /etc/environment
sudo sed -i.bak "/HTTP_PROXY/Id" /etc/environment
sudo sed -i.bak "/https_proxy/Id" /etc/environment
sudo sed -i.bak "/HTTPS_PROXY/Id" /etc/environment
sudo sed -i.bak "/ftp_proxy/Id" /etc/environment
sudo sed -i.bak "/FTP_PROXY/Id" /etc/environment
sed -i.bak '/all_proxy/Id' $shellrc
sed -i.bak '/ALL_PROXY/Id' $shellrc
sed -i.bak '/http_proxy/Id' $shellrc
sed -i.bak '/HTTP_PROXY/Id' $shellrc
sed -i.bak '/https_proxy/Id' $shellrc
sed -i.bak '/HTTPS_PROXY/Id' $shellrc
sed -i.bak '/ftp_proxy/Id' $shellrc
sed -i.bak '/FTP_PROXY/Id' $shellrc
tee -a $shellrc <<EOF
export all_proxy=
export ALL_PROXY=
export http_proxy=
export HTTP_PROXY=
export https_proxy=
export HTTPS_PROXY=
export ftp_proxy=
export FTP_PROXY=
EOF
else
echo "arg: 'on' or 'off'"
exit 1
fi
fi
fi
exit 0
sedでhttp::proxyやhttp_proxyといったものがある行を削除し、引数にonが与えられていればteeで追記し、offが与えられていれば削除したままにします。
なにかと便利。
他のアプリケーションでproxy設定が必要なものも、この中に書いとけば楽ですね。
あとがき
pingの結果を見てon/offを決めるようにスクリプトを書いて、起動時にネットワークが有効になった後自動実行するようにすると、さらに幸せかもしれません。僕はまだ試していませんが。