プロキシのもろもろ設定をコマンド一つで。

学校と自宅の両方でノートパソコンを使っていると、学校のネットワークではproxy設定をしないといけなくて、何気なくapt-get updateしてエラーめちゃくちゃでてビビる、という経験をすることがあります。今回はコマンド一つでaptの設定ファイル、シェルの環境変数などを書き換える簡単なシェルスクリプトを紹介します。

説明のため、プロキシはproxy.ac.jp、ポート番号は8080とします。各自の環境で読み替えてください。

#使い方

使い方は

```sh
sudo chmod u+x proxy_toggle.sh
```

で実行権限を与えておいたとすると

```sh
proxy_toggle.sh on
```

でプロキシ設定オン、

```sh
proxy_toggle.sh off
```

でプロキシ設定オフです。パスワードの入力を求められます。

#内容

aptの参照するファイルは/etc/apt/apt.confなので、そのファイルの中身を書き換えれば良いです。
また、おまじないに近いかもしれませんが、/etc/environmentを参照するものもあるらしいので、こちらも設定しておきます。
最後に、コマンド実行以後立ち上げるすべてのシェルでプロキシ設定を有効にするために、~/.bashrcまたは~/.zshrc等も書き換えます。

```sh:proxy_toggle.sh
#!/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を決めるようにスクリプトを書いて、起動時にネットワークが有効になった後自動実行するようにすると、さらに幸せかもしれません。僕はまだ試していませんが。