~/.netrc から ユーザー名とパスワードを取得して他コマンドへ渡す

ユーザー名とパスワードを必要とするコマンドはよくありますが、それをスクリプト化する時は面倒だったりします。毎回ユーザー名/パスワードを入力するのは手間ですし、かといってパスワードなどをスクリプト内に直書きするのはセキュリティ的にNGです。
自動化したいけれどセキュリティ面を考えると課題がある訳です。なのでこの記事はその辺の情報をうまく取り出す方法が無いかという話しです。
目次
概要
Unix系ではホームディレクトリ直下に .netrc でサーバーへのログイン情報を管理します。暗号化していないテキストファイルにID、Passが書いてあるというのもどうかという話もありますが、一応 ~/.netrc はユーザーのホームディレクトリにあって、パーミッション的にも他のユーザーからは見えない用にはなっています。なのでとりあえず .netrc を利用してみます。
.netrcからユーザー名とパスワードを取得し他のコマンドに渡してみます。
~/.netrc の形式
~/.netrc ファイルは以下の様な形式になっています。ホスト名と対応するユーザー名/パスワードがブロックになって列挙されています。
machine foo login user1 password pass1 machine bar login user2 password pass2 machine baz login user3 password pass3
ユーザー名とパスワードの取得
上記の ~/.netrc から bar のユーザー名とパスワードを取り出してみます。
Bashの場合
<span style="color: #546D7A;">#</span><span style="color: #546D7A;">!/usr/bin/</span><span style="color: #C792EA;">env</span><span style="color: #546D7A;"> bash </span><span style="color: #74CBC4;">usrinfo</span>=(<span style="color: #74CBC4;">`awk 'c&&c--;/bar/{c=2}' $HOME/.netrc | awk '{printf "%s ", $2}'`</span>) <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"user="</span>${<span style="color: #74CBC4;">usrinfo</span>[0]}<span style="color: #C2E982;">",pass="</span>$<span style="background-color: #455a64; font-weight: bold;">{</span><span style="color: #74CBC4;">usrinfo</span>[1]<span style="background-color: #455a64; font-weight: bold;">}</span>
Zshの場合
<span style="color: #546D7A;">#</span><span style="color: #546D7A;">!/usr/bin/</span><span style="color: #C792EA;">env</span><span style="color: #546D7A;"> zsh </span><span style="color: #74CBC4;">usrinfo</span>=(<span style="color: #74CBC4;">`awk 'c&&c--;/bar/{c=2}' $HOME/.netrc | awk '{printf "%s ", $2}'`</span>) <span style="color: #74CBC4; font-weight: bold;">echo</span> <span style="color: #C2E982;">"user="</span>$<span style="color: #74CBC4;">usrinfo</span>[1]<span style="color: #C2E982;">",pass="</span>$<span style="color: #74CBC4;">usrinfo</span><span style="background-color: #455a64; font-weight: bold;">[</span>2<span style="background-color: #455a64; font-weight: bold;">]</span>
bashとzshでは配列からの取得が若干異なります。
取得したユーザー名/パスワードを他コマンドへ渡す
取得したユーザー名/パスワードを他のコマンドに渡してみます。今回は例として mount_afp を利用します。
<span style="color: #546D7A;">#</span><span style="color: #546D7A;">!/usr/bin/</span><span style="color: #C792EA;">env</span><span style="color: #546D7A;"> zsh </span><span style="color: #74CBC4;">usrinfo</span>=(<span style="color: #74CBC4;">`awk 'c&&c--;/bar/{c=2}' $HOME/.netrc | awk '{printf "%s ", $2}'`</span>) mount_afp <span style="color: #C2E982;">"afp://$usrinfo[1]:$usrinfo[2]"</span> $<span style="color: #74CBC4;">HOME</span>/mountpoint1
sudoが必要なコマンドも自動実行
この方法でsudoが必要なコマンドもスクリプトから自動実行可能です。sudo は -S オプションを付けることで標準入力からパスワードを受け取る事が可能です。
<span style="color: #546D7A;">#</span><span style="color: #546D7A;">!/usr/bin/</span><span style="color: #C792EA;">env</span><span style="color: #546D7A;"> zsh</span> <span style="color: #74CBC4; background-color: #263238;">usrinfo</span>=(<span style="color: #74CBC4;">`awk 'c&&c--;/bar/{c=2}' $HOME/.netrc | awk '{printf "%s ", $2}'`</span>) <span style="color: #74CBC4; font-weight: bold;">echo</span> $<span style="color: #74CBC4; background-color: #263238;">usrinfo</span>[2] | sudo -S postfix reload
まとめ
こんな感じにすれば毎回ユーザー名やパスワードを打たずにコマンドを実行できるので便利です。必要に応じて .netrc に情報を追加すれば mysql 系の処理などにも使えます。