我在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...
如何让所有内容垂直排列? (除了" ------>"。那应该从左边开始。)
答案 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的printf
,sprintf
或字符串%
方法,该方法调用sprintf
。使用%
,您可以轻松地将字符串格式化为对齐:
format = '%7s %s'
puts format % ["------>", "Executing:"]
puts format % ["", remote_command]
output = `#{remote_command}`
output.lines.each do |line|
puts format % ["", line]
end
将其与使用capture3
的代码相结合,您应该是您想去的地方。