Linux、macOSなどのUnix環境でプロキシ設定を一括設定するシェルスクリプト(バッチ処理プログラム) ~認証プロキシ対応、yum、curl、wgetなどのProxy SettingをHTTP_PROXY、HTTPS_PROXY、FTP_PROXY、.curlrc、.wgetrcでまとめて設定~

2月 9, 2017AWS,Computers,EC2,Mac,Programming,Shell Script

LinuxやmacOSを使用して会社で業務や開発を行っているとセキュリティ対策がされているために、時々ネットワーク関係で問題が生じることもあります。

その代表的な問題が社内プロキシを経由した通信です。

特にLinux、macOSのターミナルのコマンドラインで作業をしている場合は様々なコマンドごとにプロキシ設定が必要だったり、セキュリティ対策でパスワードを変更する頻度が高かったりすると設定する箇所も多くとても大変です。

そこで今回はLinux、macOSなどのUnix環境でyum、curl、wgetなどの認証プロキシ設定を一括で設定するシェルスクリプト(バッチ処理プログラム)の例を備忘録として記載します。

プロキシ一括設定シェルスクリプト

ターミナルのコマンドラインでよく使用するコマンドとしてyum、curl、wgetなどがあります。

大抵のコマンドはhttp_proxy, HTTP_PROXY, https_proxy, HTTPS_PROXY, ftp_proxy, FTP_PROXYのプロキシに関する環境変数を参照していますが、curl、wgetなど参照しないコマンドも存在します。

そのため、プロキシ一括設定シェルスクリプトの方針としてはログイン時にプロキシの環境変数を読み込むスクリプトとコマンドごとの設定ファイルを作成する2つに分類されます。

プロキシ一括設定シェルスクリプトのファイル・ディレクトリ構成

~/                 ・・・各ユーザのホームディレクトリ
├── .bashrc     ・・・set_proxy.shの実行で.proxy.shを実行する記述が書き込まれ、ユーザログイン時に実行される。
├── .curlrc     ・・・curlコマンドのプロキシ設定。
├── .proxy.sh   ・・・HTTP_PROXY、HTTPS_PROXYなどの変数に対してプロキシ設定を行うシェルスクリプト。
├── .wgetrc     ・・・wgetコマンドのプロキシ設定。
└── set_proxy.sh・・・プロキシ一括設定シェルスクリプトの本体。

プロキシ一括設定シェルスクリプトの実行手順と実行内容

  • set_proxy.shの変数に自分の環境のプロキシ情報を設定する。
  • プロキシ一括設定を行うユーザでset_proxy.shを実行する。
  • set_proxy.shの実行で.proxy.shが作成される。
  • set_proxy.shの実行で.proxy.shの実行権限設定と実行が行われる。
  • set_proxy.shの実行で.curlrcが作成される。
  • set_proxy.shの実行で.wgetrcが作成される。
  • set_proxy.shの実行が終了する。
  • 各ユーザでログインする度に.bashrcから.proxy.shが呼び出されプロキシ設定がされる。
  • プロキシ情報の変更はset_proxy.shの変数を再設定し実行する。
  • プロキシ情報の削除はset_proxy.shでホスト名またはポート番号を空にして実行する。

プロキシ一括設定シェルスクリプトのソースコード

vim ~/set_proxy.sh

#!/bin/bash

#set_proxy.sh
#プロキシ一括設定を行うスクリプト(認証プロキシ対応)


#プロキシのホスト名
PROXY_HOST="proxy.host.com"

#プロキシのポート番号
PROXY_PORT="8080"

#プロキシの認証に使用するユーザ名
PROXY_USER="user_name"

#プロキシの認証に使用するパスワード
PROXY_PASS="password"

#プロキシに使用するプロトコル
PROTOCOL="http"


#プロキシ設定を削除する場合はホスト名またはポート番号を空にして実行
#PROXY_HOST=""
#PROXY_PORT=""

#認証プロキシではない場合はプロキシのユーザ名、パスワードは使用しない。
#PROXY_USER=""
#PROXY_PASS=""


#プロキシのホスト名またはポート番号がなければプロキシを使用しない設定をする。
if [ "${PROXY_HOST}" = "" -o "${PROXY_PORT}" = "" ]; then
  echo "" > ~/.proxy.sh
  rm -f ~/.curlrc
  rm -f ~/.wgetrc
  exit 0
fi


#ユーザ名、パスワードが設定されていれば認証プロキシとして処理する。
if [ "${PROXY_USER}" != "" -a "${PROXY_PASS}" != "" ]; then
  IS_AUTH=1
else
  IS_AUTH=0
fi

#.bashrcから呼び出し、http_proxy, HTTP_PROXY, https_proxy, HTTPS_PROXY, ftp_proxy, FTP_PROXYを設定するスクリプト.proxy.shを作成する。

#認証プロキシであればユーザ、パスワードを含んだプロキシ情報を作成する。
if [ ${IS_AUTH} -eq 1 ]; then
  PROXY="${PROTOCOL}://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}/"
else
  PROXY="${PROTOCOL}://${PROXY_HOST}:${PROXY_PORT}/"
fi

#.proxy.shを ヒアドキュメントで作成する。
cat << EOS > ~/.proxy.sh
#!/bin/sh

export http_proxy=${PROXY}
export HTTP_PROXY=${PROXY}
export https_proxy=${PROXY}
export HTTPS_PROXY=${PROXY}
export ftp_proxy=${PROXY}
export FTP_PROXY=${PROXY}

export PYCURL_SSL_LIBRARY=openssl

EOS

#.proxy.shへ実行権限を含んだ権限を与える
chmod 755 ~/.proxy.sh

#.proxy.shの実行
source ~/.proxy.sh

#.bashrcに.proxy.shの実行を記述する。(既存の記述があればスキップ)
grep ". ~/.proxy.sh" ~/.bashrc > /dev/null 2>&1
if [ $? != 0 ]; then
  echo ". ~/.proxy.sh" >> ~/.bashrc
fi

#curlコマンドのプロキシ設定ファイル.curlrc作成する。

#認証プロキシであればユーザ、パスワードを含んだプロキシ情報を作成する。
if [ ${IS_AUTH} -eq 1 ]; then

cat << EOS > ~/.curlrc
proxy-user="${PROXY_USER}:${PROXY_PASS}"
proxy="${PROTOCOL}://${PROXY_HOST}:${PROXY_PORT}"
EOS

else

cat << EOS > ~/.curlrc
proxy="${PROTOCOL}://${PROXY_HOST}:${PROXY_PORT}"
EOS

fi


#wgetコマンドのプロキシ設定ファイル.wgetrc作成する。

#認証プロキシであればユーザ、パスワードを含んだプロキシ情報を作成する。
if [ ${IS_AUTH} -eq 1 ]; then

cat << EOS > ~/.wgetrc
http_proxy=${PROTOCOL}://${PROXY_HOST}:${PROXY_PORT}
proxy_user=${PROXY_USER}
proxy_password=${PROXY_PASS}
EOS

else

cat << EOS > ~/.wgetrc
http_proxy=${PROTOCOL}://${PROXY_HOST}:${PROXY_PORT}
EOS

fi

Reference: Tech Blog citing related sources