学生たちのパスワードを生成して,Linuxにユーザアカウントを登録する作業が毎年ある。それを補助するツールはいろいろあるし,私も昔作ったことがある。今回はRubyで作ってみた。
ユーザ名は別にファイルで与える。パスワードは乱数で生成する。実際に /etc/passwd や /etc/shadow を書き換えたりホームディレクトリを作ったりするわけではなく,/etc/passwd や /etc/shadow にアペンドすべきものと,root 権限で実行すればホームディレクトリ(と public_html)を作るシェルスクリプトを生成する。
#! /usr/bin/ruby -w # -*- coding: utf-8 -*- s64 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./' uid = 10000 # uidの初期値 gid = 600 # 下のgroupに対応するgid値 shell = '/bin/bash' dir = '/home/' group = 'student' lastchg = Time.now.to_i / (60 * 60 * 24) plain = '' passwd = '' shadow = '' doit = '' while user = gets user.strip! pass = '' 8.times { pass << s64[rand(64)]} # 8桁パスワード plain << user << "\t" << pass << "\n" passwd << user << ':x:' << uid.to_s << ':' << gid.to_s << ':' << user << ':' << dir << user << ':' << shell << "\n" salt = '$1$' # MD5 ('$6$' for SHA-512) 8.times { salt << s64[rand(64)]} shadow << user << ':' << pass.crypt(salt) << ':' << lastchg.to_s << "::::::\n" doit << "mkdir -p " << dir << user << "/public_html\n" doit << "chown -R " << user << ':' << group << ' ' << dir << user << "\n" uid += 1 end File.open('plain', 'w') { |f| f.write(plain) } File.open('passwd', 'w') { |f| f.write(passwd) } File.open('shadow', 'w') { |f| f.write(shadow) } File.open('doit.sh', 'w') { |f| f.write(doit) }
使い方は,あらかじめユーザ名を行ごとに列挙したファイル users.txt
を作っておき,
./mkpasswds.rb users.txt
と打ち込む。plain
,passwd
,shadow
,doit.sh
が生成される。よく確認してから,passwd
を /etc/passwd,shadow
を /etc/shadow にアペンドしてから,root権限で doit.sh
を実行する。
Rubyの crypt()
はシステムコールするだけなので,ユーザ登録するマシン上で行うのが安全。例えばCentOSのユーザを作る作業をMac上で行ってはならない。
なお,CSV形式でユーザ名・パスワード(平文の!)をいただくこともある。この場合はパスワードの生成は不要である。上のプログラムの該当部分は次のようにすればよい:
while line = gets user,pass = line.split(',') user.strip! pass.strip!
Last modified: