119: def exec(command, &block)
120: open_channel do |channel|
121: channel.exec(command) do |ch, success|
122: raise "could not execute command: #{command.inspect} (#{ch[:host]})" unless success
123:
124: channel.on_data do |ch, data|
125: if block
126: block.call(ch, :stdout, data)
127: else
128: data.chomp.each_line do |line|
129: $stdout.puts("[#{ch[:host]}] #{line}")
130: end
131: end
132: end
133:
134: channel.on_extended_data do |ch, type, data|
135: if block
136: block.call(ch, :stderr, data)
137: else
138: data.chomp.each_line do |line|
139: $stderr.puts("[#{ch[:host]}] #{line}")
140: end
141: end
142: end
143:
144: channel.on_request("exit-status") do |ch, data|
145: ch[:exit_status] = data.read_long
146: end
147: end
148: end
149: end