ruby net::ssh不在channel.on_数据上打印标准输出数据

ruby net::ssh不在channel.on_数据上打印标准输出数据,ruby,ssh,Ruby,Ssh,我想用ruby的net::ssh运行一个远程命令,并希望打印输出stdout,但我在频道的下面代码中没有看到任何打印内容 请参阅测试代码: Net::SSH.start('testhost', "root", :timeout => 10) do |ssh| ssh.open_channel do |channel| channel.exec('ls') do |_, success| unless success puts "NOT SUCCEES

我想用ruby的
net::ssh
运行一个远程命令,并希望打印输出
stdout
,但我在
频道的下面代码中没有看到任何打印内容

请参阅测试代码:

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
为什么我不进入数据块
?我想抓取
stdout


请注意,我知道客户端代码能够
ssh
远程服务器
,因为当我要求命令为
ls>ls.log
时,我在目标主机上看到了
ls.log

请注意,打开通道是异步的,因此您必须等待通道执行任何有意义的操作,否则,您将过早关闭连接

试试这个:

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

请注意,打开通道是异步的,因此您必须等待通道执行任何有意义的操作,否则您会过早地关闭连接

试试这个:

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

谢谢,但是我看到调用了
频道。on_close
,而没有添加
ch.wait
,即使操作需要2分钟,如果on_close是异步的,那么即使没有
ch.wait
,也不会关闭连接。如果您不等待,那么由于此代码是异步的,应用程序可以执行任何它想执行的操作,包括退出。如果它退出,那么它将关闭所有打开的连接,包括异步连接。不管您是在这里还是在任何其他地方使用ch.wait,但是如果在应用程序结束之前对您很重要,您应该等待它完成。我尝试运行
sleep 20
,作为在没有
ch.wait
的情况下运行的命令,我看到它正在等待它完成。所以从一方面来说,它是在等待它结束,但另一方面,它没有在
on_data
上发送事件,我不明白它是否在等待进程结束,为什么不将数据发送到
on_data
?谢谢,但我看到
频道。调用on_close
时没有添加
ch.wait
,即使操作需要2分钟,如果on_close是异步的,那么即使没有
ch.wait
,也不会关闭连接。如果您不等待,那么由于此代码是异步的,应用程序可以执行任何它想执行的操作,包括退出。如果它退出,那么它将关闭所有打开的连接,包括异步连接。不管您是在这里还是在任何其他地方使用ch.wait,但是如果在应用程序结束之前对您很重要,您应该等待它完成。我尝试运行
sleep 20
,作为在没有
ch.wait
的情况下运行的命令,我看到它正在等待它完成。因此,从一方面来说,它在等待它完成,但从另一方面来说,它没有在
on_data
上发送事件,我不明白它是否在等待进程结束,为什么不将数据发送到
on_data