如何让shell命令输出排队?

时间:2013-09-05 20:40:57

标签: ruby bash shell

我在Ruby中编写实用程序方法,以便在远程服务器上运行shell命令。

这是我到目前为止所拥有的......

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...

如何让所有内容垂直排列? (除了" ------>"。那应该从左边开始。)

1 个答案:

答案 0 :(得分:3)

你不能按照你的方式去做。 Connection to host.com closed.由您调用的命令输出,而不是通过STDOUT返回,您可以使用反引号捕获它。

问题是使用反引号。它们不捕获STDERR,这很可能是ssh在输出其状态时使用的。

修复是使用Open3的方法,例如capture3,它将获取被调用程序返回的STDOUT和STDERR流,并允许您以编程方式输出它们,允许您对齐它们:

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

您还应该查看Ruby的printfsprintf或字符串%方法,该方法调用sprintf。使用%,您可以轻松地将字符串格式化为对齐:

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

将其与使用capture3的代码相结合,您应该是您想去的地方。