Я хотел запустить удаленную команду с ruby
net::ssh
и надеялся распечатать вывод stdout
, но я не вижу ничего напечатанного в приведенном ниже коде на channel.on_data
ruby 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
на целевом хосте.
спасибо, но я вижу, что 'channel.on_close' вызывается без добавления' ch.wait' даже если операция занимает 2 минуты, если это асинхронная как ON_CLOSE работает и не закрывая соединение даже без 'ch.wait'? – Jas
Если вы не ждете, потому что этот код является асинхронным, приложение может делать все, что захочет, включая выход. Если он выйдет, то он закроет все открытые соединения, включая ваш асинхронный. Не имеет значения, используете ли вы ch.wait здесь или в любом другом месте, но вам стоит подождать, пока он закончит, если он будет импортирован вам до того, как приложение закончится. – SztupY
Я попытался запустить 'sleep 20' в качестве команды для запуска без 'ch.wait', и я вижу, что он ждет его завершения. Поэтому с одной стороны его ждет, пока он закончится, но с другой стороны он не отправляет события в on_data. Я не понимаю, ожидает ли процесс, почему он не отправляет данные в 'on_data' ? – Jas