2013-08-02 3 views
1

У меня есть код, который требует от меня подключения к одному серверу, rsync на другой сервер, а затем подключиться ко второму серверу и запустить на нем множество команд. Но в обязательном порядке второе SSH-соединение вызывает ошибку 'do_open_failed': open failed (1) (Net::SSH::ChannelOpenFailed). Я делаю что-то неправильно здесь, есть ли способ закрыть первое соединение должным образом, что делает второе соединение?SSH Соединения один за другим, второй сбой

Net::SSH.start(self.from_creds['host'], self.from_creds['user'], :password => self.from_creds['password']) do |ssh| 
    channel = ssh.open_channel do |ch| 
    ch.exec "/usr/bin/rsync -e ssh -varuzP --exclude=sys-export --delete #{self.from_creds['filepath']}/#{self.client_id}/ #{self.scp_to}/#{new_client_id}" do |ch, success| 
     raise "could not execute command" unless success 

     # "on_data" is called when the process writes something to stdout 
     ch.on_data do |c, data| 
     $stdout.print data 
     end 

     # "on_extended_data" is called when the process writes something to stderr 
     ch.on_extended_data do |c, type, data| 
     $stderr.print data 
     end 

     ch.on_close { puts "done!" } 
    end 
    end 
    channel.wait 
end 
Net::SSH.start(self.to_creds['host'], self.to_creds['user'], :password => self.to_creds['password']) do |ssh1| 
    # Do some other stuff here 
    tmp_path = "#{self.to_creds['filepath']}/tmp/#{Time.now.to_i}" 
    ssh1.exec "mkdir -p #{tmp_path}" 
    ssh1.exec "cd #{self.to_creds['filepath']}/#{new_client_id}" 
end 
+0

Кроме того, второе соединение будет работать хорошо, если первый из них не существует. Но, очевидно, мне нужны и то, и другое. – Magicmarkker

+0

Вы пытались использовать 'ssh.loop' вместо' channel.wait'? Я не знаю, есть ли разница. –

+0

Кроме того, 'exec' не блокируется. Во втором стартовом блоке попробуйте вместо этого использовать 'exec!' Или заставьте 'ssh' ждать завершения команд. –

ответ

1

Согласно документации, exec не блокируется. Вместо этого используйте вместо этого exec!.

Net::SSH.start(self.to_creds['host'], self.to_creds['user'], :password => self.to_creds['password']) do |ssh1| 
    # Do some other stuff here 
    tmp_path = "#{self.to_creds['filepath']}/tmp/#{Time.now.to_i}" 
    ssh1.exec! "mkdir -p #{tmp_path}" 
    ssh1.exec! "cd #{self.to_creds['filepath']}/#{new_client_id}" 
end 

В качестве альтернативы,

Net::SSH.start(self.to_creds['host'], self.to_creds['user'], :password => self.to_creds['password']) do |ssh1| 
    # Do some other stuff here 
    tmp_path = "#{self.to_creds['filepath']}/tmp/#{Time.now.to_i}" 
    ssh1.exec "mkdir -p #{tmp_path}" 
    ssh1.exec "cd #{self.to_creds['filepath']}/#{new_client_id}" 
    ssh1.loop 
end 
Смежные вопросы