2017-02-16 7 views
0

Я хотел запустить удаленную команду с rubynet::ssh и надеялся распечатать вывод stdout, но я не вижу ничего напечатанного в приведенном ниже коде на channel.on_dataruby ​​net :: ssh не печатает данные stdout на channel.on_data

см код теста:

Net::SSH.start('testhost', "root", :timeout => 10) do |ssh| 
    ssh.open_channel do |channel| 
    channel.exec('ls') do |_, success| 
     unless success 
     puts "NOT SUCCEESS:! " 
     end 
     channel.on_data do |_, data| 
     puts "DATAAAAAA:! " # ======> Why am i not getting to here?? <======= 
     end 
     channel.on_extended_data do |_, _, data| 
     puts "EXTENDED!!!" 
     end 
     channel.on_request("exit-status") do |_, data| 
     puts "EXIT!!!! " 
     end 
     channel.on_close do |ch| 
     puts "channel is closing!" 
     end 
    end 
    end 
end 

и выход:

channel is closing! 

почему я не попасть в т он блокирует on_data? Я хочу захватить stdout.

обратите внимание, что я знаю, что код клиента может ssh к remote server, потому что, когда я попросил команду, чтобы быть ls > ls.log я увидел, что ls.log на целевом хосте.

ответ

2

Обратите внимание, что открытие канала является асинхронным, поэтому вам нужно ждать, пока канал сделает что-либо значимое, иначе вы слишком быстро закрываете соединение.

Попробуйте это:

Net::SSH.start('test', "root", :timeout => 10) do |ssh| 
    ch = ssh.open_channel do |channel| 
    channel.exec('ls') do |_, success| 
     unless success 
     puts "Error" 
     end 
     channel.on_data do |_, data| 
     puts data 
     end 
     channel.on_extended_data do |_, _, data| 
     puts data 
     end 
     channel.on_request("exit-status") do |_, data| 
     puts "Exit" 
     end 
     channel.on_close do |ch| 
     puts "Closing!" 
     end 
    end 
    end 

    ch.wait 
end 
+0

спасибо, но я вижу, что 'channel.on_close' вызывается без добавления' ch.wait' даже если операция занимает 2 минуты, если это асинхронная как ON_CLOSE работает и не закрывая соединение даже без 'ch.wait'? – Jas

+0

Если вы не ждете, потому что этот код является асинхронным, приложение может делать все, что захочет, включая выход. Если он выйдет, то он закроет все открытые соединения, включая ваш асинхронный. Не имеет значения, используете ли вы ch.wait здесь или в любом другом месте, но вам стоит подождать, пока он закончит, если он будет импортирован вам до того, как приложение закончится. – SztupY

+0

Я попытался запустить 'sleep 20' в качестве команды для запуска без 'ch.wait', и я вижу, что он ждет его завершения. Поэтому с одной стороны его ждет, пока он закончится, но с другой стороны он не отправляет события в on_data. Я не понимаю, ожидает ли процесс, почему он не отправляет данные в 'on_data' ? – Jas