3

ログイン/非ログイン、インタラクティブ/非インタラクティブシェルのこの素晴らしい説明を読みましたhttp://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano / . しかし、特定のシェルで capistrano 3 を実行する方法がどこにも見つかりませんでした。次のようなオプションを試しました:

set :pty, true # non-login, interactive but does not load .bashrc
set :default_shell, '/bin/bash --login'
set :shell, '/bin/bash --login'

しかし、何も役に立ちませんでした。ありがとう。

4

2 に答える 2

0

これはかなり古い質問だと思いますが、以下は SSHKit クラスを開いてログイン シェルを有効にする方法を示しています。

# backend/sshkit.rb
module SSHKit
  class CommandMap
    class SuffixProvider
      def initialize
        @storage = CommandHash.new
      end 

      def [](command)
        @storage[command] ||= []

        @storage[command]
      end

      def to_s(command)
        self.[](command).join(" ")
      end
    end

    def [](command)
      cmd = []

      if prefix[command].any?
        prefixes = prefix[command].map{ |prefix| prefix.respond_to?(:call) ? prefix.call : prefix  }
        cmd.push(prefixes.join(" "))
      end

      cmd.push(@map[command])

      cmd.join(" ")
    end

    def suffix
      @suffix ||= SuffixProvider.new
    end
  end

  class Command
    def to_s
      [SSHKit.config.command_map[command.to_sym], *Array(args), SSHKit.config.command_map.suffix.to_s(command.to_sym)].compact.join(' ')
    end
  end
end

SSHKit コマンド マップを定義bash --loginして、特定のコマンドを有効にできるようになりました。

SSHKit.config.command_map[:rvm].prefix("bash --login '")
SSHKit.config.command_map[:rvm].suffix("'")

:rvmこれで、以下のようなコマンドを使用できます。

execute :rvm, :use, '2.2.2', '--install'
# => bash --login 'rvm use 2.2.2 --install'

これをさらに説明するブログ投稿を書きました。ただし、必要な場合にのみログイン シェルを使用することをお勧めします。

于 2015-08-15T21:24:59.080 に答える
-1

私はあなたへの答えを見つけていません...

しかし、私がしたことは、A word about PTYs のアドバイスに従うことでした。

Capistrano が接続を確立するとき、それは非ログイン、非対話型シェルです。これは事故ではありませんでした!

対話型ログインの一部として.bash_profileに設定されているものが必要になる場合がありますか? カピストラーノによって呼び出されるため、 .bashrcに移動します。

于 2014-05-02T07:01:33.113 に答える