Executing another cmdl-app with ruby and typing in a password?

Hi,
I'm writing a gui with ruby and glade and so far it works well. Now the program I write a gui for has an option which wants you to type a password in the console. I start it this way:
  system("anotherapp --encrypt")
then in the commandline happens something until it gets printed:
  Password:
And it wants me to type in a password. I want to send this password from my gui to the cmdlline. But how can I get the Password in it? I tried to pipe it with:
  system("echo 'pwd' | anotherapp --encrypt")
but this doesn't work at all.

Any idea how to do this?

greets

···

--
kazaam <kazaam@oleco.net>

this has nothing to do with ruby per se: the program requires a pty, the ruby distribution has examples, including an 'expect' based example, in ext/pty/expect_sample.rb.

a @ http://codeforpeople.com/

···

On Nov 17, 2007, at 11:25 AM, kazaam wrote:

Any idea how to do this?

--
share your knowledge. it's a way to achieve immortality.
h.h. the 14th dalai lama

Thanks for pointing me in the right direction. I now wrote a little loop to do this work:

require 'pty'
require 'expect'

PTY.spawn("ruby test.rb") do |read_t,write_t,pid|
  write_t.sync = true
  read_t.expect(/^enter passphrase.*/) {write_t.print "123456"}
end

But I have a problem. How to find out if the spawned process executed with or without errors? I mean in this example "ruby test.rb". If I use system I could do:
  puts "error" if not system("ruby test.rb")

But PTY.spawn always just returns 'nil'. Is there any way I can check for correct execution?

···

--
kazaam <kazaam@oleco.net>

cfp:~ > cat a.rb
require "yaml"
require "pty"

module PTY
   def self.execute *a, &b
     begin
       spawn *a, &b
       0
     rescue => e
       e.status rescue raise
     end
   end
end

status =
   PTY.execute "ruby" do |r,w,pid|
     w.sync = true
     w.puts "42"
     y 'gets' => r.gets.strip.to_i
   end
y 'status' => status

cfp:~ > ruby a.rb

···

On Nov 18, 2007, at 12:45 AM, kazaam wrote:

Thanks for pointing me in the right direction. I now wrote a little loop to do this work:

require 'pty'
require 'expect'

PTY.spawn("ruby test.rb") do |read_t,write_t,pid|
  write_t.sync = true
  read_t.expect(/^enter passphrase.*/) {write_t.print "123456"}
end

But I have a problem. How to find out if the spawned process executed with or without errors? I mean in this example "ruby test.rb". If I use system I could do:
  puts "error" if not system("ruby test.rb")

But PTY.spawn always just returns 'nil'. Is there any way I can check for correct execution?

--
kazaam <kazaam@oleco.net>

---
gets: 42
---
status: 0

a @ http://codeforpeople.com/
--
we can deny everything, except that we have the possibility of being better. simply reflect on that.
h.h. the 14th dalai lama