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

~/.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&amp;&amp;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&amp;&amp;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&amp;&amp;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&amp;&amp;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 系の処理などにも使えます。