柿食えば 屁をしても一人

電気系の学生のブログ。何を書くかも決めていない

他のサーバのユーザの情報を別のサーバに移植する

複数のサーバを運用していて、追加したり、OS更新したりして、ユーザの再登録が必要になった時に、全自動とは言えないけど、半自動で行う(行った)方法。
PWが初期化されるのはしょうがないものとする。

コピー元のサーバalpha、コピー先のサーバbravoとしてやる。

ユーザー一覧の取得
cat /etc/passwd

ユーザとuidとgidの一覧が出てくる。

cat /etc/passwd | grep "gid"

gidで選べば、ほしいユーザの一覧がもらえる。(grepはor,andできるのでなんとかしよう)
それを、txtファイルに流し込む。

cat /etc/passwd | grep "gid" >list.csv
データの加工

任意のエディタで":"を","に変換する。(":"を","に変換するのをパイプラインでやったほうがいい)。
excelで開いて、ユーザ名とuid,gidだけを残し、1列目からそれぞれ、ユーザ名、uid, gidで保存。何も書かなくて良いけど4列以上書く(理由は後述)

スクリプトの作成
#!/bin/bash
csvfile=hoge.csv
for line in `cat ${csvfile} | grep -v ^#`
do
    user=`echo ${line} | cut -d ',' -f 1`
    pass=`echo ${line} | cut -d ',' -f 1`
    uid=`echo ${line} | cut -d ',' -f 2`
    gid=`echo ${line} | cut -d ',' -f 3`
    eval useradd ${user} -g ${gid} -u ${uid}
    expect -c "
    spawn passwd ${user}
    expect \"New password:\"
    send -- \"${pass}\n\"
    expect \"Retype new password:\"
    send -- \"${pass}\n\"
    expect \"passwd: all authentication tokens updated successfully.\"
    send -- \"exit\n\"
    "
done

参考というかコピペ
対話式のコマンドをスクリプト化する方法 - Qiita

このスクリプトをrootで実行すればすべてのユーザを移動できる。

Tips
  • echoでspritしているときにgidに数字+改行コードが混ざってしまい落ちる(n敗)。それを簡単に防ぐには1つダミーの列を追加するのが良い。
  • LDAPとかRadiusとかの認証サーバの必要性を強く感じた。