0
ruby
のnet::ssh
でリモートコマンドを実行したかったので、出力stdout
を印刷したいと考えましたが、以下のコードでは何も表示されませんchannel.on_data
ruby 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
することができます知っている
ノート。
おかげで、それはon_closeが働いているか非同期(async)だ場合、私は、 'channel.on_close'は、操作が2分かかる場合でも、' ch.wait'を追加せずに呼び出されることを確認し、 'ch.wait'がなくても接続を閉じないでください。 – Jas
このコードが非同期であるため、待機しないと、アプリケーションは終了を含めたいものを何でも実行できます。ただし、終了した場合は、非同期の接続を含め、開いているすべての接続が閉じられます。ここでch.waitを使うのか他の場所で使うのかは関係ありませんが、アプリケーションが終了する前にインポートが完了するまで待つべきです。 – SztupY
私は 'sleep 20'をコマンドとして実行してみましたが、 'ch.wait'と私はそれが完了するのを待っていることがわかります。だから一方の側からそれが終わるのを待っていますが、反対側では 'on_data'でイベントを送信していません。なぜプロセスが終了するのを待っているのか分かりません。なぜ' on_data'にデータを送りませんか? ? – Jas