session.exec を使用して Net::SSH::Multi を実行すると、出力をすぐに取得するにはどうすればよいでしょうか?ルビー

StackOverflow https://stackoverflow.com/questions/1383282

  •  21-09-2019
  •  | 
  •  

質問

そこで、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top