csv2ldif CSVからLDIFへ秒速変換

みなさまこんにちは。
前回CentOS7でOpenLdapを秒速構築する手順のご紹介をしましたが、今回はそれに関連する投稿です。
LDAPへのユーザ登録を皆さんはどのように行われていますか?
LDIFファイルを用いるのが一般的だと思いますが、LDAPサーバの移行でもない限り、LDIFファイルを用いたユーザの一括登録が必要になります。ご存知の通り、LDIFファイルのフォーマット上、大量ユーザ分の作成はなかなか面倒で、よくCSVから変換する形で作成されます。
世の中にはcsv2ldifというツールがあるようで、githubに上がってます。こちらを用いて作れたらきっと楽なのだと思いますが、私のpython環境の問題なのか、使おうとしたら上手く動作しなかったので、今回はその際に作成したshellのご紹介をします。shellが動けば使えますが、その分出来は悪いのでご容赦を!

なお、今回の環境では、OS、openldapのバージョンは以下を利用しました。
OS:CentOS Linux release 7.6.1810
LDAP:slapd 2.4.44

csv2ldap CSVからLDIFへ秒速変換


shellを作成!

CentOS7はインストール済みで、root権限を持つユーザでログインしていることを前提とします。
以下をコピペして、<ファイル名>.shで保存してください。Linuxをご存知の方ならみたら自分の使いたいように編集して使えると思います。

#!/bin/sh

while read LINE; do
 VAL1 ='echo ${LINE} | cut -d , -f 1,2,3,4'
 VAL2 ='echo ${LINE} | cut -d , -f 5'
 VAL3 ='echo ${LINE} | cut -d , -f 6'
 VAL4 ='echo ${LINE} | cut -d , -f 7'
 VAL5 ='echo ${LINE} | cut -d , -f 8'
 VAL6 ='echo ${LINE} | cut -d , -f 9'
 VAL7 ='echo ${LINE} | cut -d , -f 10'
 VAL8 ='echo ${LINE} | cut -d , -f 11'
 VAL9 ='echo ${LINE} | cut -d , -f 12'
 VAL10 ='echo ${LINE} | cut -d , -f 13'

 echo "#user:${VAL1}"
 echo "dn:${VAL1}"
 echo "objectclass:${VAL2}"
 echo "objectclass:${VAL3}"
 echo "objectclass:${VAL4}"
 echo "objectclass:${VAL5}"
 echo "cn:${VAL6}"
 echo "uid:${VAL7}"
 echo "sn:${VAL8}"
 echo "userPassword:${VAL9}"
 echo "mail:${VAL10}"
 echo ""

done < FILENAME.csv

一応、簡単に使い方をご紹介します。
LDAPで利用するスキーマや属性情報により、必要となるLDIFファイルの中身が変わってくるので、CSVファイルは以下の形式で作成します。行がユーザ情報、列が属性情報です。

ユーザー1LDIF1行目,ユーザー1LDIF2行目,ユーザー1LDIF3行目,…
ユーザー2LDIF1行目,ユーザー2LDIF2行目,ユーザー2LDIF3行目,…
ユーザー3LDIF1行目,ユーザー3LDIF2行目,ユーザー3LDIF3行目,…
:
:

という感じです。
1点だけ注意点があります。LDAPのdn情報は、カンマ区切りです。その為、shellの中で活用しているcutコマンドで、デミリタをカンマにすると、上手く動きません。カッチョいいのは正規表現だの何だのを使う方法だと思うのですが、すみません。時間優先で今回はDNの分CSVの列を分けるパティーンのサンプルとしています。
上記さえ気をつければ、あとはCSVに合わせて、shellを編集するだけ。以下がCSVの具体例です。shell内にinputとなるCSVファイル名を記載するのをお忘れなく。

uid=test001,ou=users,dc=testnet,dc=local,top,person,organizationalPerson,inetorgpersn,test001,TEST USER1,pass1,test001@testnet.local
uid=test002,ou=users,dc=testnet,dc=local,top,person,organizationalPerson,inetorgpersn,test002,TEST USER2,pass2,test002@testnet.local



実行してみよう!


そして最後にシェル実行。

# ./csv2ldif.sh

実行結果は標準出力として表示されるので、”>”でファイルに吐き出すか、もしくはshellを修正してファイル出力して下さい。先ほどのサンプルCSVの場合の出力例は以下な感じ。

 #user:"uid=test001,ou=users,dc=testnet,dc=local"
 dn:"uid=test001,ou=users,dc=testnet,dc=local"
 objectclass:top
 objectclass:person
 objectclass:organizationalPerson
 objectclass:inetorgperson
 cn:test001
 uid:test001
 sn:TEST USER1
 userPassword:pass1
 mail:test001@testnet.local
 
 #user:"uid=test002,ou=users,dc=testnet,dc=local"
 dn:"uid=test002,ou=users,dc=testnet,dc=local"
 objectclass:top
 objectclass:person
 objectclass:organizationalPerson
 objectclass:inetorgperson
 cn:test002
 uid:test002
 sn:TEST USER2
 userPassword:pass2
 mail:test002@testnet.local

不格好なので、機会を見てpython版も作成しようかと思います。(import csvを使えばサクッと作れると思っているのは素人考えなのか。。。)

最後に、Linuxにご興味がある方向けに、ややマニアックなコマンドのご紹介です。以下から是非ご覧ください。

acコマンド