How to use Net::SSH


#1

Hi all,

I am having following code in ruby

require ‘net/ssh’
require ‘net/sftp’
begin
Net::SSH.start
(‘132.147.161.159’,:password=>‘k’,:port=>1234,:username=>‘k’) do |ssh|
ssh.sftp.connect do |sftp|
Dir.foreach(’.’) do |file|
puts file
end
end
end
rescue Exception=> Ex
puts Ex.message
end

After executing the above code it is giving me following error

Bad file descriptor - connect(2)

username, password, and ipaddress are fine

What I want is to take data from remote machine to server.

Please Help me out.

Thanks and Regards,
Shri


#2

On Tue, Apr 7, 2009 at 10:27 PM, Shripad removed_email_address@domain.invalid
wrote:

 ssh.sftp.connect do |sftp|

Shri
What are you wanting to do? SFTP or SSH? From the code,
it appears that you’re trying to move a file from point A to B.
Thus, here’s a brief outline of the things that you can do with
SFTP:

require ‘net/sftp’

Net::SFTP.start(‘host’, ‘username’, :password => ‘password’) do |sftp|
# upload a file or directory to the remote host
sftp.upload!("/path/to/local", “/path/to/remote”)

# download a file or directory from the remote host
sftp.download!("/path/to/remote", "/path/to/local")

# grab data off the remote host directly to a buffer
data = sftp.download!("/path/to/remote")

# open and write to a pseudo-IO for a remote file
sftp.file.open("/path/to/remote", "w") do |f|
  f.puts "Hello, world!\n"
end

# open and read from a pseudo-IO for a remote file
sftp.file.open("/path/to/remote", "r") do |f|
  puts f.gets
end

# create a directory
sftp.mkdir! "/path/to/directory"

# list the entries in a directory
sftp.dir.foreach("/path/to/directory") do |entry|
  puts entry.longname
end

end

Good luck,

-Conrad


#3

On Wed, Apr 8, 2009 at 12:08 AM, Shripad removed_email_address@domain.invalid
wrote:

sftp.rb:43:in

On Tue, Apr 7, 2009 at 10:27 PM, Shripad removed_email_address@domain.invalid

(‘132.147.161.159’,:password=>‘k’,:port=>1234,:username=>‘k’) do |ssh|
After executing the above code it is giving me following error
Shri
sftp.upload!("/path/to/local", “/path/to/remote”)
end
sftp.dir.foreach("/path/to/directory") do |entry|
puts entry.longname
end
end

Good luck,

-Conrad

Can you upgrade the gem and retrying what you
did before? You can upgrade by doing the following:

sudo gem update

-Conrad


#4

Hi,

I updated the gem.
but still it is showing me the same error.
I am using windows, is that a problem for SFTP?
IS OpenSSH require for SFTP to connect to remote machine?
Is there any other way to do this?

Thanks and Regards,
Shripad


#5

On Wed, Apr 8, 2009 at 1:09 AM, Shripad removed_email_address@domain.invalid
wrote:

Shripad

Shripad, I’m not sure of the state of Capistrano on Windows. I’m sure
that
you’ll need the OpenSSH library installed on your system. Thus, it may
be
easier to install Cygwin and install OpenSSH from there. Otherwise, you
can
switch to Linux or Mac OS X or other Unix variant.

Good luck,

-Conrad


#6

Hi,
Thanks Conrad for ur urgent reply

What I want to do is just pickup the images from machine A to machine
B.

I did what you say but I am getting error as follows

E:/InstantRails/ruby/lib/ruby/gems/1.8/gems/net-sftp-2.0.2/lib/net/
sftp.rb:43:in
start': undefined methodshutdown!’ for nil:NilClass
(NoMethodError)
from SSHTransfer.rb:8

what I write is this
sftp=Net::SFTP.start(‘132.147.161.159’, ‘k’,:password => ‘k’)

Thanks and Regards


#7

No, The same error appears on my Power Mac OSX 10.5.7

$ cat data-sync.rb

require ‘rubygems’
require ‘net/sftp’
host, user, passwd = ‘10.50.33.100’, ‘login’, ‘pass’
path = ‘/var/cms/storenew/workspace/live/data’
Net::SFTP.start(host, user, passwd) do |sftp|
sftp.file.open(path, ‘r’) do |f|
puts f.gets()
end
end

Error for Ruby 1.8.6 EE:

$ ruby -v
ruby 1.8.6 (2008-08-08 patchlevel 286) [i686-darwin9.6.0]

$ ruby data-sync.rb
/opt/ruby-enterprise-1.8.6-20090201/lib/ruby/gems/1.8/gems/net-
sftp-2.0.2/lib/net/sftp.rb:43:in start': undefined methodshutdown!’
for nil:NilClass (NoMethodError)
from data-sync.rb:7

And the same for Ruby 1.9:

$ ruby1.9 -v
ruby 1.9.1 (2008-12-30 patchlevel-0 revision 21203) [i386-darwin9]

$ ruby1.9 data-sync.rb
/opt/local/lib/ruby1.9/gems/1.9.1/gems/net-sftp-2.0.2/lib/net/sftp.rb:
43:in rescue in start': undefined methodshutdown!’ for nil:NilClass
(NoMethodError)
from /opt/local/lib/ruby1.9/gems/1.9.1/gems/net-sftp-2.0.2/lib/net/
sftp.rb:31:in start' from data-sync.rb:7:in


#8

Ech we were fooled by misleading example from
http://net-ssh.rubyforge.org/sftp/v1/faq.html.
The correct API is at
http://net-ssh.rubyforge.org/sftp/v2/api/index.html.
So instead of

sftp = Net::SFTP.start(‘host’, ‘username’, ‘password’)

it should be:

sftp = Net::SFTP.start(‘host’, ‘username’, :password => ‘password’)