中島@ブレーンです。

On Wed, Aug 01, 2001 at 05:40:18PM +0900,
 takashi Yamaoka wrote:

> UNIXでのパスワード変更のコマンド(passwd)は
> 対話形式ですのでRubyのexpect.rbを使えば
> これを実現できるというのは自分なりに調べて
> 分かったんですが、具体的にどのようにロジックを
> 書いてやればよいのか見当がつきません。

PFMというツールの中で、まさにそれ(expect.rbによるパスワード変更)をやっ
ています。単体で動くように修正したものを引用します。

-------------------------------------------------------------------
require "pty"
require "expect"

$expect_verbose = true

module Expect2
  def spawn(cmd)
    raise "Expect2::spawn is not reentranrant" if defined? @r_f and @r_f
    puts "spawn #{cmd}" if $expect_verbose
    PTY.spawn(cmd) do  |r_f,w_f,pid|
      @r_f = r_f
      @w_f = w_f
      @child_pid = pid
      @w_f.sync = true
      PTY.protect_signal do
	yield
      end
    end
    Process.waitpid(@child_pid, nil)
    @r_f = @r_w = @child_pid = nil
  end
    
  def expect(pattern, timeout=10)
    unless defined? @r_f and @r_f
      raise "expect must be called in spawn do ... end " 
    end
    ret = @r_f.expect(pattern, timeout) do | match |
      unless match
	pattern = pattern.source if pattern.kind_of?(Regexp)
	raise "expect #{pattern} timeout "
      end
      put_to_cmd yield(match)
    end
  end
  
  def put_to_cmd(msg)
    unless defined? @r_f and @r_f
      raise "put_to_cmd must be called in spawn do ... end " 
    end
    @w_f.puts(msg)
  end
end


if $0 == __FILE__
  include Expect2
  def set_password(user, pass)
    spawn("/usr/bin/passwd #{user}") do
      expect(/New UNIX password:/) { pass }
      expect(/Retype new UNIX password:/) { pass }
    end
  end

  set_password("test", "testpass1")
end
-------------------------------------------------------------------

-- 
「stableでなければ生きていけない。unstableでなければ生きてる意味がない」
中島 拓 (株)ブレーン 研究部 (p95 / brain-tokyo.co.jp)
http://www03.u-page.so-net.ne.jp/dc4/tnaka/