当我尝试运行使用 sudo 作为参数而不是命令的cap shell命令时,执行仅在用作命令时与sudo相关的替换。
示例:
$ cap shell
cap> rpm -q sudo
由于shell.rb包含
,因此失败command = command.gsub(/\bsudo\b/, "sudo -p '#{configuration.sudo_prompt}'")
将命令变为
rpm -q sudo -p '\\''sudo password: '\\''
rpm命令在遇到-p选项时需要包文件。没有包装,所以它失败了。
当我尝试从cap shell运行grep sudo
等时,会出现类似的问题。
有没有办法在cap shell命令中使用 sudo 作为参数?
答案 0 :(得分:0)
AFAICS,这个问题似乎是Capistrano的一个错误。因此,请向the 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
已替换为^
中的command.gsub()
。但其他一切都是一样的。