- 締切済み
Rubyのpopen3について
はじめまして 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)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率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から出力する。
- kmee
- ベストアンサー率55% (1857/3366)
マニュアル、読んでますか? サンプルコードもけっこう載ってますよ http://doc.ruby-lang.org/ja/1.8.7/class/Open3.html
補足
ここのマニュアルは読んでます。 SSHでの接続で、シェルスクリプトを実行するところまでは出来ていて、 実行するシェルスクリプトが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