2017-02-16 12 views
0

rubynet::sshでリモートコマンドを実行したかったので、出力stdoutを印刷したいと考えましたが、以下のコードでは何も表示されませんchannel.on_dataruby​​ net :: sshはchannel.on_dataの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 

をし、出力は次のようになります。

channel is closing! 

私はトンに取得しない理由彼はブロックon_data?私はstdoutをつかみたい。私はls > ls.logするコマンドを尋ねられたとき、私は、ターゲットホスト上でそのls.logを見たので、クライアントコードがremote serverからsshすることができます知っている

ノート。

答えて

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

おかげで、それはon_closeが働いているか非同期(async)だ場合、私は、 'channel.on_close'は、操作が2分かかる場合でも、' ch.wait'を追加せずに呼び出されることを確認し、 'ch.wait'がなくても接続を閉じないでください。 – Jas

+0

このコードが非同期であるため、待機しないと、アプリケーションは終了を含めたいものを何でも実行できます。ただし、終了した場合は、非同期の接続を含め、開いているすべての接続が閉じられます。ここでch.waitを使うのか他の場所で使うのかは関係ありませんが、アプリケーションが終了する前にインポートが完了するまで待つべきです。 – SztupY

+0

私は 'sleep 20'をコマンドとして実行してみましたが、 'ch.wait'と私はそれが完了するのを待っていることがわかります。だから一方の側からそれが終わるのを待っていますが、反対側では 'on_data'でイベントを送信していません。なぜプロセスが終了するのを待っているのか分かりません。なぜ' on_data'にデータを送りませんか? ? – Jas

関連する問題