パスワード生成,Linuxアカウント登録

学生たちのパスワードを生成して,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

と打ち込む。plainpasswdshadowdoit.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: