2

私はcapistranoの初心者で、この問題に数日間頭を悩ませてきたので、助けていただければ幸いです。

煩わしいセキュリティ設定があります。つまり、リモートサーバーでsshユーザーとしてcapistranoタスクを実行できません。これは、この問題のより単純なバージョンです-これは実用的な答えを持っていないようです。

編集:これをさらに掘り下げて、私は次のようなことができることがわかりました:

run "su - newuser" do |channel, stream, data|

          channel.send_data("#{password}\n")

          channel.send_data("rm -rf #{release_path}\n")

        end }

これを使用して、デフォルトのデプロイメソッドを上書きし、必要なことのほとんどを実行できます。サーバーなどに必要なディレクトリを作成し、ssh転送を使用してsshユーザーとしてgitからプルすることができます。これが私の次の問題を引き起こします。これで、ssh_userが所有するファイルとディレクトリを含むnewuserが所有するディレクトリができました。newuserとしてsudo権限を持っていますが、ファイルをchmodする方法がわかりません。私は次のようなものを試しました:

run "su - newuser" do |channel, stream, data

              channel.send_data("#{password}\n")

              channel.send_data("sudo chmod 775 #{cache_path}\n")

            end }

しかし、すべてがハングし、ブロックが無限ループで実行されているように見えます。明らかに、私がここで理解していないことがたくさんあり、いくつかのポインタは、たとえ良い関連性のある読み物であっても、大いに感謝されるでしょう。

4

2 に答える 2

2

https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invocation-Run は、次のように設定できるrunの:shellオプションを示しています。

run "your cmd", :shell => "su - other_user -s bash"

事前定義されたタスクを使用する場合は、runとsuを再定義して、シェルオプションをマージすることをお勧めします。これは、sshユーザーがパスワードなしでsuできることを前提としています。ブロックを使用してパスワードを送信しない場合:

run "your cmd", :shell => "su - other_user -s bash" do |channel, stream, data|
  channel.send_data("#{other_user_password}\n")
end
于 2013-02-11T17:58:26.887 に答える
0

私が最終的に思いついた解決策は、既存のすべてのデプロイタスクを取得し、それらを新しい名前空間に配置することでした。次に、それらをnewuserまたはrootとして実行する必要があるかどうかに応じて、新しいメソッドで実行するスクリプトを呼び出しました。これは、Viktorのソリューションとは非常に近いため、うまく機能しなかったとしても、彼の答えを受け入れています。私のため

    def run_as(user, password, command, env)
      run "#{command}\n", :shell => "su - #{user}", :env => env do |channel, stream, data|   
        channel.send_data("#{password}\n")
      end
end
于 2013-02-13T13:23:23.813 に答える