AFAICS,这个问题似乎是 Capistrano 中的一个错误。所以,请向BTS报告。
Capistrano::Shell::exec_command()
无论如何,您可以通过在您自己的cap
命令中覆盖私有方法来解决此问题。
- 创建一个名为
mycap.rb
- 将原件复制到
/usr/bin/cap
您的mycap.rb
- 添加
require 'capistrano/shell'
- 添加
exec_command()
你的mycap.rb
/\bsudo\b/
用类似的东西替换正则表达式/^sudo\b/
- 执行
mycap.rb
而不是原来的cap
命令
mycap.rb 的内容应该是这样的:
#!/usr/bin/env ruby
require 'capistrano/cli'
require 'capistrano/shell'
module Capistrano
class Shell
private
def exec_command(command, servers)
command = command.gsub(/^sudo\b/, "sudo -p '#{configuration.sudo_prompt}'")
processor = configuration.sudo_behavior_callback(Configuration.default_io_proc)
sessions = servers.map { |server| configuration.sessions[server] }
options = configuration.add_default_command_options({})
cmd = Command.new(command, sessions, options.merge(:logger => configuration.logger), &processor)
previous = trap("INT") { cmd.stop! }
cmd.process!
rescue Capistrano::Error => error
warn "error: #{error.message}"
ensure
trap("INT", previous)
end
end
end
Capistrano::CLI.execute
请注意,\b
替换为^
in command.gsub()
。但其他一切都是一样的。