2

当我尝试运行使用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 选项时需要一个包文件。没有包,所以它失败了。

当我尝试grep sudo从 cap shell 运行等时会出现类似的问题。

有没有办法在 cap shell 命令中使用sudo作为参数?

4

1 回答 1

0

AFAICS,这个问题似乎是 Capistrano 中的一个错误。所以,请向BTS报告。

Capistrano::Shell::exec_command()无论如何,您可以通过在您自己的cap命令中覆盖私有方法来解决此问题。

  1. 创建一个名为mycap.rb
  2. 将原件复制到/usr/bin/cap您的mycap.rb
  3. 添加require 'capistrano/shell'
  4. 添加exec_command()你的mycap.rb
  5. /\bsudo\b/用类似的东西替换正则表达式/^sudo\b/
  6. 执行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()。但其他一切都是一样的。

于 2012-08-14T15:15:58.517 回答