Rubyで外部コマンドを実行し標準入力にデータを渡す
Sambaで利用しているLDAPにまとめてユーザを追加したいことがあった。
ユーザ・パスワードはすでに分かっていているのでCSVに落としている。これを登録したいのだけど、パスワードを求められて結局ひとつづつパスワードを入力しなければならなくなる。
そこで、Rubyから外部コマンドを実行したとき、その外部コマンドの標準入力としてデータを渡すには以下のようにする。
# 以下の変数には適当な値が入っているとする # user : ユーザ名 # group : グループ # password : パスワード # smbldap-useraddコマンドでユーザを登録 u = open("|smbldap-useradd -a -g #{group} -H [UX] #{user}") u.close # 上のコマンドで登録したユーザのパスワードをsmbldap-passwdコマンドを利用して設定する pass = open("|smbldap-passwd #{user} > /dev/null",'w') pass.puts password # パスワードを指定 pass.puts password # 確認用のパスワードを指定 pass.close
今回重要なのは下から4行。
openを実行して返ってきたpassオブジェクトに対してputsメッセージを送るとsmbldap-passwdコマンドの標準入力として扱われる。確認用パスワード入力もあるので2回putsを実行している。