# Expect and ruby

**URL:** <https://www.ruby-forum.com/t/expect-and-ruby/86547>\
**Category:** Ruby\
**Created:** [February 23, 2007, 4:33am UTC](https://www.ruby-forum.com/t/expect-and-ruby/86547 "2007-02-23T04:33:30Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![rlorimor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/96bed5/32.png) [@rlorimor](https://www.ruby-forum.com/u/rlorimor)\
**Post date:** [February 23, 2007, 4:33am UTC](https://www.ruby-forum.com/t/expect-and-ruby/86547/1 "2007-02-23T04:33:30Z")

</div>

I need to communicate with a sftp server from a Ruby script. What’s  
the best way to do this? I am looking for something like “expect” I  
found a way to spawn and expect using the “pty” standard lib but I  
didn’t see a “send” I found a rexpect on RubyForge but that looks  
like it hasn’t been maintained in months. What should I be looking at?

---

<div class="post-metadata">

**Author:** ![rlorimor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/96bed5/32.png) [@rlorimor](https://www.ruby-forum.com/u/rlorimor)\
**Post date:** [February 23, 2007, 4:44am UTC](https://www.ruby-forum.com/t/expect-and-ruby/86547/2 "2007-02-23T04:44:31Z")

</div>

On Feb 22, 2007, at 7:33 PM, Robert La Ferla wrote:

> I need to communicate with a sftp server from a Ruby script.  
> What’s the best way to do this? I am looking for something like  
> “expect” I found a way to spawn and expect using the “pty”  
> standard lib but I didn’t see a “send” I found a rexpect on  
> RubyForge but that looks like it hasn’t been maintained in months.  
> What should I be looking at?

You should check out net/ssh and net/sftp:

[http://raa.ruby-lang.org/project/net-sftp/](http://raa.ruby-lang.org/project/net-sftp/)  
[http://raa.ruby-lang.org/project/net-ssh/](http://raa.ruby-lang.org/project/net-ssh/)

Cheers-  
– Ezra Z.  
– Lead Rails Evangelist  
– removed\_email\_address@domain.invalid  
– Engine Y., Serious Rails Hosting  
– (866) 518-YARD (9273)

---

<div class="post-metadata">

**Author:** ![rlorimor](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/96bed5/32.png) [@rlorimor](https://www.ruby-forum.com/u/rlorimor)\
**Post date:** [February 23, 2007, 11:43am UTC](https://www.ruby-forum.com/t/expect-and-ruby/86547/3 "2007-02-23T11:43:16Z")

</div>

On Fri, Feb 23, 2007 at 12:43:43PM +0900, Ezra Z. wrote:

> You should check out net/ssh and net/sftp:
> 
> [http://raa.ruby-lang.org/project/net-sftp/](http://raa.ruby-lang.org/project/net-sftp/)  
> [http://raa.ruby-lang.org/project/net-ssh/](http://raa.ruby-lang.org/project/net-ssh/)

There’s a simpler solution using built-in libraries:

(1) require ‘expect.rb’ which is included in the standard library

* * *

$ cat /usr/share/doc/libruby1.8/pty/README.expect  
README for expect  
by A. Ito, 28 October, 1998

```
    Expect library adds IO class a method called expect(), which

```

does similar act to tcl’s expect extension.

The usage of the method is:

IO#expect(pattern,timeout=9999999)

## where `pattern' is an instance of String or Regexp and `timeout’ is Fixnum, which can be omitted. When the method is called without block, it waits until the input which matches the pattern is obtained from the IO or the time specified as the timeout passes. When the pattern is obtained from the IO, the method returns an array. The first element of the array is the entire string obtained from the IO until the pattern matches. The following elements indicates the specific pattern which matched to the anchor in the regular expression. If the method ends because of timeout, it returns nil. When the method is called with block, the array is passed as the block parameter.

(2) use IO.popen to start your client program (or use the built-in  
open3.rb  
library if you want to catch stderr separately)

HTH,

Brian.
