passwdファイルの重複エントリ予防

パスワードアカウントの大量発行なんてのはこの時期が旬。 passwdファイルベースでやってるところは減ってるかもしれんけどその話。

master.passwd にデータを追加するとき、 追加するユーザごとのエントリは大量なのでスクリプトで自動生成。でも、 vipwがviを呼ぶこともあって、実際のファイルへの追加は手動でやってた。 目でチェックしないと不安だし。

むかーしむかし、理工学部の計算センターでやってたときは 頻繁にアカウント登録があるのにすべてが手動ベースだったのを見兼ねて passwd/shadow(Solaris) ファイルをロックして編集するスクリプトをperlで作り、 それが以後の標準となった。でもそこそこ作るのに時間がかかって、 バグがないかなあとチェックもかなり神経を遣った記憶がある。

で、今はアカウント登録が年に1回のペースなので先述の半自動方式。

ふと、EDITOR=exでええんちゃう? と思ってやってみたら 殆んどワンライナーで重複エントリを潰してから登録するのがでけた。

まず、その回に登録するユーザのレコードを生成するときに、 ついでに user name だけを持った配列(実際にはhash)を作っておく。 その配列を元に、

^(newuser1|newuser2|newuser3|...|newuserN):

というファイルを作る。これを newids というファイルにでも保存。 新規登録するアカウントは newrecord というファイルにでも入ってるとする。 すると、

/usr/bin/printf '%%!egrep -v -f newids
r newrecord
%%!sort -n -t: -k3
wq\n' | EDITOR=ex vipw

としておけば、2度目3度目続けてやってもOK。前年度分と同じユーザ名 があったら弾く、とかしたいところだが、ユーザ名が登録年度と個人IDで 自動的に決まるようなところではやんなくても十分。