dポイントプレゼントキャンペーン実施中!

はじめまして
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相当です。
なにぶん初心者の為、なにをどうすれば良いか分からない状態です。

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

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

A 回答 (2件)

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から出力する。

この回答への補足

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
    • good
    • 0

マニュアル、読んでますか?


サンプルコードもけっこう載ってますよ

http://doc.ruby-lang.org/ja/1.8.7/class/Open3.html

この回答への補足

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

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

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

厳しい。

補足日時:2013/08/03 13:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!