0

リモート サーバーでシェル コマンドを実行するユーティリティ メソッドを Ruby で作成しています。

これが私がこれまでに持っているものです...

def exec_remotely(command)
  remote_command = "ssh -t #{@config['remote_username']}@#{@config['target_server']} '#{command}'"
  puts "------> Executing:"
  puts "        #{remote_command}"
  output = `#{remote_command}`
  output.lines.each do |line|
    puts "        #{line}"
  end
end

コンソールで必要な効果は次のとおりです。

------> Executing:
        ssh -t user@host.com 'ls -alh'
        Connection to host.com closed.
        total 8.7M
        drwx------ 10 username username 4.0K Sep  5 18:11 .
        drwxr-xr-x  3 root  root  4.0K Aug 26 21:18 ..
        -rw-------  1 username username 1.6K Sep  5 17:47 .bash_history
        -rw-r--r--  1 username username   18 Dec  2  2011 .bash_logout
        -rw-r--r--  1 username username   48 Aug 27 02:52 .bash_profile
        -rw-r--r--  1 username username  353 Aug 27 03:05 .bashrc

        # etc...

しかし、私が代わりに得ているのはこれです...

------> Executing:
        ssh -t user@host.com 'ls -alh'
Connection to host.com closed.
        total 8.7M
        drwx------ 10 username username 4.0K Sep  5 18:11 .
        drwxr-xr-x  3 root  root  4.0K Aug 26 21:18 ..
        -rw-------  1 username username 1.6K Sep  5 17:47 .bash_history
        -rw-r--r--  1 username username   18 Dec  2  2011 .bash_logout
        -rw-r--r--  1 username username   48 Aug 27 02:52 .bash_profile
        -rw-r--r--  1 username username  353 Aug 27 03:05 .bashrc

        # etc...

すべてを垂直に並べるにはどうすればよいですか? (「------>」を除いて。それは左端から始まるはずです。)

4

1 に答える 1

3

あなたの思い通りにはできません。Connection to host.com closed.呼び出したコマンドによって出力され、バッククォートでキャプチャできる STDOUT 経由では返されません。

問題は、バックティックの使用です。STDERR はキャプチャされません。STDERR は、ssh がステータスを出力するときに使用している可能性が最も高いものです。

capture3修正は、呼び出されたプログラムによって返された STDOUT および STDERR ストリームを取得し、それらをプログラムで出力できるようにするなど、Open3 のメソッドを使用することです。

stdout_str, stderr_str, status = Open3.capture3([env,] cmd... [, opts]) 

を呼び出すRuby のprintfsprintfまたは String の%メソッドも確認する必要がありますsprintf。を使用%すると、文字列を簡単にフォーマットして揃えることができます。

format = '%7s %s'
puts format % ["------>", "Executing:"]
puts format % ["", remote_command]
output = `#{remote_command}`
output.lines.each do |line|
  puts format % ["", line]
end

それを使用するコードと組み合わせると、目的のcapture3場所に移動できるはずです。

于 2013-09-05T20:46:43.260 に答える