締切済み

Rubyのpopen3について

  • すぐに回答を!
  • 質問No.8203372
  • 閲覧数605
  • ありがとう数1
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 0% (0/2)

はじめまして
Rubyをはじめて1か月の初心者です。

popen3を使用するにあたって大変困っております。
popen3で外部コマンドを実行して、実行結果の標準出力をファイルとして格納しようと思っています。

外部コマンドの内容は、SSH接続でサーバへログインし、そこにあるシェルスクリプトを実行させるもので、
呼び出すシェルスクリプトに対して、Rubyから標準入力を渡し、シェルスクリプトが標準入力を受け取り、
それをもとに呼び出したシェルスクリプトがさらに別のシェルスクリプトを呼び出し、実行結果を標準出力としてRubyで受け取ってファイルに格納したいと思っています。

ソースとしては、以下のようにしてますが、標準入力を引き渡す方法が分かりません。
その為、標準入力を引き渡す部分は記述していません。

Open3.popen3('ssh localhost sh test.sh ') do |stdin, stdout, stderr|
  begin
   loop do
    IO.select([stdout,stderr]).flatten.compact.each { |io|

     if stdout != "" then
      stdout_lines = stdout
       puts("stdout_lines = " + stdout_lines)
     end
     stderr_lines = stderr if stderr != ""
     puts("stderr_lines = " + stderr_lines)

    }
    break if $stdout.classed? && $stderr.closed?
  end
  rescue EOFError
  end
end

JRubyの1.6.8なので、Rubyのバージョンは1.8.7相当です。
なにぶん初心者の為、なにをどうすれば良いか分からない状態です。

まず、実現が可能かを知りたいです。

実現可能であれば、標準入力を引き渡す方法を教えていただきたく。
よろしくお願いします。

回答 (全2件)

  • 回答No.2

ベストアンサー率 55% (1857/3366)

shellからの出力を、Rubyで入力として受けとってますよね?
shellの入力に渡すには、その逆で、Rubyから出力してやればいいのです。

シェルから続けて別なコマンドに渡すには

方法1) パイプライン込みのコマンドラインを popen3の引数として指定する
Open3.popen3('sh test.sh | sh test2.sh')

方法2) Rubyでパイプラインの代りをする
Open3.popen3('sh test.sh') #A
Open3.popen3('sh test2.sh') #B
Aの出力をRubyで入力し、Bの入力へとRUbyから出力する。
補足コメント
yasuhira1011

お礼率 0% (0/2)

test.shに対して、標準入力を引き渡す方法が分かりました。

以下のように、Open3.popen3のdoの最初にstdinに対してデータをWriteしてあげれば、
シェルの方で、『cat -』 をすれば標準入力が取得できました。

説明が下手でちゃんと伝えられませんで、すみません。
色々読み取っていただきありがとうございます。


Open3.popen3('ssh localhost sh test.sh ') do |stdin, stdout, stderr|

  stdin.write(data1)
  #標準入力のクローズ
  stdin.close


  begin
   loop do
    IO.select([stdout,stderr]).flatten.compact.each { |io|

     if stdout != "" then
      stdout_lines = stdout
       puts("stdout_lines = " + stdout_lines)
     end
     stderr_lines = stderr if stderr != ""
     puts("stderr_lines = " + stderr_lines)

    }
    break if $stdout.classed? && $stderr.closed?
  end
  rescue EOFError
  end
end
投稿日時 - 2013-09-06 09:52:10
  • 回答No.1

ベストアンサー率 55% (1857/3366)

マニュアル、読んでますか?
サンプルコードもけっこう載ってますよ

http://doc.ruby-lang.org/ja/1.8.7/class/Open3.html
補足コメント
yasuhira1011

お礼率 0% (0/2)

ここのマニュアルは読んでます。

SSHでの接続で、シェルスクリプトを実行するところまでは出来ていて、
実行するシェルスクリプトがRubyからの標準入力を受け取る方法が分かれば解決なのかと思っています。

どうも、根本的にシェルが分かってないので、
なんともかんともって感じです。

厳しい。
投稿日時 - 2013-08-03 13:06:17
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ