perlによるユーザーの一括登録

作業手順

学校というところは毎年多数のユーザーアカウントの登録作業が必要になる。これをperlスクリプトを用いて一括処理できる。

また、移動プロファイルを使用するために雛形ユーザーの設定で作成されたプロファイルデータを新規登録のユーザーにコピーをする必要がある。

単にコピーすることに不安がないわけではない。hogeという雛形ユーザーの名前が陽に入っていて、それをuser01に使わせた場合の不具合が出る可能性がある。しかし、user.datのような格納形式が公開されていないファイルもあり、経験的に大丈夫であったとしかいうことができない。いままででうまくいかなかったのはimeのユーザー辞書のみ。これは「WSHによるログオン時実行プログラム」で対策した。

手順は次のようになる。

  1. ユーザー名、パスワードを決める。
  2. 登録用にユーザー名、パスワードなどが入ったファイルにする。
  3. スクリプトでユーザーの登録とパスワードの設定をする。(unixアカウント)
  4. スクリプトでユーザーの登録とパスワードの設定をする。(sambaアカウント)
  5. スクリプトでプロファイルデータをコピーする。

1. ユーザー名とパスワードを決める

ユーザー名とパスワードは実用的な意味合いに加えて教育的な意味合いも持つ。

ユーザー名

ユーザー名は英字で始まる半角(いまどきこの言い方も変だが)英数8文字以内。英字はすべて小文字。トラブルを避けるために経験的な方針。ユニークである(同じものがない)ことは必須。

学籍の番号などを使わずに生徒名から作りたかったがさすがに同姓同名の管理が大変。次のような方針にしている。

n5hanako

n:登録時のクラス名。本校ではa,b,c,d,…。

5:入学年度の下一桁。ここまでで、同姓同名の管理はクラス単位ですればよいことになる。

hanako:生徒の名前または名字から6文字をとる。多少長くても問題ないのだが、6文字に切りつめている。

本校の歴史的理由からひらがなのよみをローマ字に変換するプログラムを作っていたので敷居は低かった。

パスワード

乱数による自動生成。8桁英数。はじめた2000年当時キーボードが初めてという生徒もいたのでShiftキーの使用を避け、l(エル)と1(いち)など判別しずらいものは片方しか使わないこととした。さすがに覚えにくく、ちょっと手を加えて子音が続かないようにしている。これを覚えることが1時間目の宿題となる。2,3例を挙げると、

huquqok4
1dapotot
u3ikeupa
8ihpa5ri
m6turech

2. 登録用ファイル

登録用にユーザー名、パスワードなどが入ったファイルを作る。それをスクリプトで読み込んで一括処理をする。フォーマットはスクリプトの設計に合わせるのでスクリプト次第だが、歴史的な偶然もあって現在は以下のようになっている。

a5wakame huquqok4 isono wakame
a5katsuo 1dapotot isono katsuo
a5nobita u3ikeupa nobi nobita
a5takesi 8ihpa5ri gouda takesi
.....

スペース区切りで改行はdos-windows形式(CR-LF)。第3、第4項はunixアカウントのGECOSフィールド用に入れたもの。GECOSフィールド同様実質的な意味のない歴史的存在。ただ、最後の項目がパスワードでないことは、改行がLFだけであるunixとの互換性で問題になったときに被害を押さえてくれる可能性がある。

ファイルのパーミッション(アクセス権)に注意。本当は登録が終了したら削除が望ましいが、アカウントの抹消の時のためにそのままにしてある。(いま振り返れば、転入転出退学などもあるのだから抹消の時に学籍のデータから作り直すのが正解だと思う)

3. ユーザーの登録とパスワードの設定(unixアカウント)

登録用ファイルを読み込みながら、useradd と chpasswd というコマンドを使う。

プログラム作成中の確認のための print 命令を残している。これで split 関係の動作が判るかと思う。

chopは文字列の最後の1文字を削除するコマンド。ファイルがWindowsで作られるという仮定で改行の2文字を削除している。ファイルの改行文字に合わせて数を調整する。(このスクリプト自身は改行はunix形式で1文字でなければならない)

必要ないと思いつつ、GECOSフィールドにフルネームを入れている。フルネームにはスペースが入るので、ダブルクォートで囲む必要がある。 ¥"はそのために入っている

#!/usr/bin/perl
print "add new user\n";

$filename="y05st.txt";

open(SFILE,$filename) || die "cannot open $filename";
while (<SFILE>){
   chop;
   chop;
   ($uname,$password,$gc,$os)=split(/ /);
   print "$u - $p - $gc / $os\n";
   $user_fullname=$gc . " " .  $os;
   print "$user_fullname\n"; 
   `/usr/sbin/useradd -c \"$user_fullname\" -m $uname`;
    open(CMD, "| /usr/sbin/chpasswd > /dev/null");
    print CMD "$uname:$password\n";
    close(CMD);
}
close(SFILE);

バッククォートで囲んだ部分はシェルを呼び出して実行する。-c はコメントでGECOSフィールドに入れる文字列を続ける。-m はホームディレクトリを作成をおこなう(設定でなく作成。続く文字列はなし)。ここまでがオプションで、最後にユーザー名が引数となっている。

open から cloase までは $uname:$password\n というデータをパイプを使って chpasswd コマンドに渡している部分である。chpasswd は標準入力からユーザ名とパスワードの組が記されているファイルを読み込んでパスワードを設定するコマンド。

3. ユーザーの登録とパスワードの設定(sambaアカウント)

smbpasswd コマンドを使用する。試用をはじめた1999年のsambaではunixアカウントだけでsambaを使用することができたが、windowsがパスワードを暗号化して送るようになったため別ファイルを必要とするようになり、このスクリプトをつくった。このときすでにunixアカウントがあったので別のスクリプトとして作り、統合しないまま使い続けている。

その後、sambaのバージョンがあがってsmbpasswdのファイル形式(smbpasswdはコマンド名であり、ファイル名でもある)が変わった。#でコメントアウト(無効化)されているsmbadduserは昔のやり方である。

新しい smbpasswd は普通はパスワードの変更コマンド。-a オプションをつけると新規登録になる。-sオプション(プログラム中では a と合わせて -as と記述)は標準入力からパスワードを受け取るようにするもの。

パスワードは2回訊かれるので $password\n を2度書いている。

#!/usr/bin/perl
print "set samba passwd\n";

$filename="y05st.txt";
$ct=0;

open(SFILE,$filename) || die "cannot open";
while (<SFILE>){
   chop;
   chop;
   ($uname,$password,$gc,$os)=split(/ /);
   #`/usr/bin/smbadduser $uname:$password`;
    open(CMD, "| /usr/bin/smbpasswd -as $uname > /dev/null");
    print CMD "$password\n$password\n";
    close(CMD);
    $ct=$ct+1;
    print "$uname  $gc $os - $ct\n";
}
close(SFILE);

プロファイルデータをコピーする

プロファイルのコピーを行う。コピー元は hoge という雛形ユーザー。

useradd コマンドでユーザーホームディレクトリ(ログインする時のディレクトリ)を作る時に一緒にコピーするようにできるかもしれないと後で気づいたが ウェブ公開用の public も作るのでこのまにしている。

#!/usr/bin/perl
print "copy .profile & mkdir user public\n";

$filename="y05st.txt";

$ct=0;
open(SFILE,$filename) || die "cannot open";
while (<SFILE>){
   chop;
   chop;
   ($uname,$password,$gc,$os)=split(/ /);
   print "$gc $os -";
   `mkdir  /home/$uname/.profile`;
   `mkdir  /home/$uname/user`;
   `cp  -rf /home/testu/.profile/* /home/$uname/.profile`;
   `chown   $uname:$uname /home/$uname/.profile -R`; 
   `chown   $uname:$uname /home/$uname/user`;
   `chmod   0700 /home/$uname/ -R`;

   # for thunderbird
   `mkdir  /home/$uname/tb`;
   `mkdir  /home/$uname/tb/profile`;
   `chown   $uname:$uname /home/$uname/tb -R`;
   `chmod   0700 /home/$uname/tb -R`;


   # for public_html
   `mkdir  /home/public/$uname/`;
   `chown   $uname:$uname /home/public/$uname/ -R`;
   `chmod   0755 /home/public/$uname/ -R`; 
   $ct=$ct+1;
   print "$ct\n";
}
close(SFILE);

root(管理者)権限で作業するのでファイルの所有者をそれぞれのユーザー名にしなければ使えなくなる。

thunderbirdはmozilla系のメールソフト。popしたメールを u:ドライブに置くようにするために必要な作業になっている。最近メールソフトを変更したので分かれている。thunderbirdについてはまた書く機会があると思う。

パーミッションはホームディレクトリは自分しか読み書きできないようにする。public はファイルは一般からも読むことだけを許可、ディレクトリは読みとりと実行権を許可しないとブラウズできないくなる。

この区別をするために異なる場所にしている。(普通はホームディレクトリの中に public_html フォルダを作り、ユーザーが適宜読込を許可すればよいことだが、windowsからパーミッションを捜査することが難しい)

ユーザーの削除

生徒が卒業すれば削除しなければならない(本校でも授業がなくなっても卒業まで使わせている)。これも記しておく。

実はこれもunix,samba別々に書かれていたのでここで合わせたが、この状態でテストしていないので、ミスが潜んでいるかも知れない。

smbpasswd はsambaアカウントを操作する。-x は削除。

userdel はunixアカウント。-r はremoveで、このオプションをつけるとアカウントの削除と同時にユーザーホームディレクトリを中のファイルと共に削除する。このユーザーのメールスプールも削除される。

しかし、ウェブページのデータは消えないので、rm コマンドで削除する。-fr は -f がforceで削除の確認をしない、-r がrecursiveでサブフォルダ内のファイルもすべて削除するというオプション。

削除すべきユーザー名はアカウント作成時のものを使っているが、上にも書いたように本来は別に管理して新たにパスワード無しのものをつくることとし、パスワードの入ったファイルをおいておかない方がよい。

#!/usr/bin/perl
# delete user

$filename="y05st.txt";

$ct=0;

open(SFILE,$filename) || die "cannot open";
while (<SFILE>){
   chop;
   chop;
   ($uname,$password,$gc,$os)=split(/ /);
   $user_fullname=$gc . " " .  $os;
   print "$uname  $user_fullname  - delete - ";
   `/usr/bin/smbpasswd -x $uname`;
   `/usr/sbin/userdel -r $uname`;
   'rm -fr /home/public/$uname/`;
   $ct=$ct+1;
   print "$ct\n";
}

close(SFILE);

ウェブページのデータを保存しておきたい場合は、所有者がいないファイルにならないように適当なユーザーの所有に変えればよい。たとえば hoge にする場合は、rmの行を次のようにする。

`chown -R hoge: /home/public/$uname`;

-R はrecursiveでサブフォルダ内のファイルもすべて変更するというオプション。ディレクトリ名は旧ユーザー名のままになるが問題はない。

ただ public ディレクトリ内のエントリが増えていくので何年もたてばパフォーマンスに影響があるかも知れない。これが心配なら適当なディレクトリ内に移動すればよいが、ウェブサーバーの管理下におかないと見ることができなくなるので注意。

printコマンドで途中経過を表示するのは実はunixの文化ではない。エラーがない時は無言というのがunix文化である。確かにsmbpasswd, userdel, rm などのコマンドでエラーが出てもたくさんの出力に埋もれて気がつきにくい。ただ自信のない者にとっては順調にすすんでいるのが見えると安心するのも事実。

 ▲ 
聖愛高等学校
http://www.seiai.ed.jp/
Last update: 2006-03-31