2

コマンドではなくsudoを引数として使用するcapshellコマンドを実行しようとすると、コマンドとして使用された場合にのみ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コマンドの引数としてsudoを使用する方法はありますか?

4

1 に答える 1

0

AFAICS、この問題はCapistranoのバグのようです。だから、防弾少年団に報告しください。

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

これはinに\b置き換えられていることに注意してください。しかし、他のすべては同じです。^command.gsub()

于 2012-08-14T15:15:58.517 に答える