session.exec を使用して Net::SSH::Multi を実行すると、出力をすぐに取得するにはどうすればよいでしょうか?ルビー
質問
そこで、Net::SSH::Multi を使用して SSH 経由で複数のマシンにログインし、session.exec("some_command") を使用してリモートマシン上でシェルコマンドを実行しようとしました。
コード:
#!/usr/bin/ruby
require 'rubygems'
require 'net/ssh'
require 'net/ssh/multi'
Net::SSH::Multi.start do |session|
# Connect to remote machines
### Change this!!###
session.use 'user@server'
loop = 1
while loop == 1
printf(">> ")
command = gets.chomp
if command == "quit" then
loop = 0
else
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
end
end
end
現時点で私が抱えている問題は、対話型プロンプトでコマンドを入力すると、「session.exec」が出力ユーティリティを返さないことです。プログラムを終了しました。誰かがこの問題に遭遇して教えてくれるかどうか疑問に思っていました。この問題を解決するにはどうすればよいでしょうか?
解決
session.exec後session.loopを追加するには、プログラムが出力を待つことができます。
のような:
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
session.loop
# Or session.wait also does the same job.
他のヒント
見てください ここ. 。の exec
このメソッドは、その結果を提供されたブロックに渡すようです。
ドキュメントからの例:
session.exec("command") do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
免責事項:私自身はこれをテストしませんでした。うまくいくかもしれないし、うまくいかないかもしれない。うまくいきましたらお知らせください!
execの呼び出し後、whileループとコールsession.loopを削除します。このような何かます:
Net::SSH::Multi.start do |session|
# Connect to remote machines
### Change this!!###
session.use 'user@server'
session.exec(command)do |ch, stream, data|
puts "[#{ch[:host]} : #{stream}] #{data}"
end
# Tell Net::SSH to wait for output from the SSH server
session.loop
end
所属していません StackOverflow