ruby net::ssh不在channel.on_数据上打印标准输出数据
我想用ruby的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
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
?