4

EC2 に移行する前に、コミットを bitbucket リポジトリにプッシュし、受信後フックでそれらをサーバーにプルさせます。コミット後、URL http://mywebsite.com/update.phpが呼び出され、update.php が呼び出されます。は:

    <?php `git pull`; ?>

それは魔法のように機能していました。ただし、EC2 では機能していません。その理由はわかりません。

私は次のことを試しました:

  1. sudo chmod +x update.phpこれにより、update.php が実行可能になります。

  2. update.php を次のように変更しました

     <?php `sudo git pull`; ?>
    
  3. update.php を次のように変更しました

     <?php `sudo -s`; `git pull`; ?>
    
  4. update.php を次のように変更しました

     <?php `sudo -s git pull`; ?>
    

ssh 経由でインスタンスを使用している場合、ec2-user として「git pull」を実行できるため、パーミッションと関係があると思います。また、「git pull」は、root ユーザーの場合に機能します。

どうすれば動作させることができますか? 私はそれが許可に関係していたと思います。

アップデート

トラブルシューティングを行ったところ (ヒント @cyberx86 に感謝)、次のことがわかりました。

実行することでコマンドラインで更新フックを実行できましたが、php update.phpルートである理由は機能しましたが、ec2 ユーザーの場合は機能しませんでした。エラーログが表示されました

エラー: .git/FETCH_HEAD を開けません: 権限が拒否されました

chmod -R 777 .gitそのため、root ユーザーとしてコマンドを実行しました。

git pullコマンド ライン経由で更新をphp update.php取得できるようになりましたが、post-receive フックを介して実行したり、ブラウザで url/update.php を指定したりしても機能しません。エラーログが表示されます

ホスト キーの検証に失敗しました。^M
致命的です: リモート エンドが予期せず電話を切りました

これは、ブラウザ経由でアクセスしたときにコマンドを実行するユーザーにsshキーが設定されていないため、シェルコマンドが実行されているように見えますが、リモートリポジトリがそのユーザーにプルさせていないことを意味すると思います.

@cyberx86 のアドバイスに従って、/etc/passwd でユーザーをチェックアウトしました。PHP ユーザーはいませんが、apache: という名前のユーザーがいます。apache:x:48:48:Apache:/var/www:/sbin/nologin実行sudo -u apache php -q update.phpして、次のメッセージを受け取りました。

ディレクトリ '/var/www/.ssh' を作成できませんでした。

ホスト 'bitbucket.org (207.223.240.181)' の信頼性を確立できません。

RSA キーのフィンガープリントは編集済みです

接続を続行しますか (はい/いいえ)? はい

ホストを既知のホストのリスト (/var/www/.ssh/known_hosts) に追加できませんでした。

許可が拒否されました (公開鍵)。

致命的: リモート エンドが予期せず電話を切りました

したがって、ブラウザ経由でシェルスクリプトを実行するユーザー(おそらくapache)のsshキーを設定するだけの問題のようです。

4

2 に答える 2

2
  1. PHPファイルは通常、実行するために実行可能である必要はありません
  2. PHPスクリプトを(単に実行するのではなくgit pull)直接実行してみてください。さらに重要なのは、ユーザーPHPが(おそらくwww-dataapacheなどec2-user)実行されるときにPHPスクリプトを実行してみてくださいsudo -u php_user php -q /path/to/update.php
  3. error_reportingおよびの冗長性を高めdisplay_errorsます。ログファイルも確認します。
  4. 最後にsudo(スクリプトにあるもの)は、sudoersでセットアップされている場合にのみ機能します。これは、おそらくphpユーザー向けではありません。

ユーザーphpは次のように実行されます。

  1. Apacheのhttpd.conf(UserGroupディレクティブ)
  2. VirtualHostセットアップで(たとえば、suExecを使用している場合-ディレクティブを探しますSuexecUserGroup
  3. userPHPプロセスマネージャー(およびプールのディレクティブ)としてphp-fpmを使用する場合は、PHP-FPMプール(/etc/php-fpm.d/)の構成でgroup

権限(つまり)を変更する代わりに、ファイルchmodの所有権(chown)をphpユーザーの所有権と一致するように変更する必要があります。PHPファイルには通常644のアクセス許可があり、ディレクトリには755のアクセス許可が必要です。777は、テスト(または場合によっては一時ディレクトリ)以外では避ける必要があります。所有権を修正する場合は、そのような緩い権限は必要ありません。

最後に、2つの問題があるようです。1。phpユーザーがgitサーバーに接続するためのキー設定がないことと2. gitサーバーのキーのコピーがないこと(つまり、認証するため)適切なサーバーに接続していること)。

gitサーバーにログインするためのキーを取得するには(私はbitbucketに精通していません)、次のいずれかが必要になると思います(すべてではなく、1つだけ)。

  • PHPユーザーが利用できるようにするSSHキー(ユーザーroot用)がすでにあります
  • PHPユーザー用にサーバー上に新しいキーを生成し、それをbitbucketにアップロードします
  • bitbucketで新しいキーを生成し、それをサーバーにダウンロードして、PHPユーザーのキーに追加します。

gitサーバーのキーを取得するには、次のように簡単にする必要があります。

  1. 正しい所有権と権限でディレクトリ/var/www/.sshを作成します(phpがそれに書き込むことができるように)。
  2. サーバーからgitリポジトリにSSH接続して(または実行git clone中-それgit pullも機能する可能性があります)、phpのユーザーとして-gitサーバーが提供するキーを受け入れてみてください。

bitbucketを使用するようにサーバーを最初にセットアップしたときに、上記と同様のことを行ったと思います(そうでない場合は、ドキュメントを参照してください) 。

于 2012-05-05T18:05:18.030 に答える
0

(OPに代わって投稿)

解決しました。これが私がしたことです。トラブルシューティングのために、追加しました

echo `whoami`;

update.php に変更し、ブラウザーで実行すると、ユーザー名が表示されました (ユーザー apache ではなく、仮想ホスト ファイルに設定された別のユーザーでした)。/bin/bash へのアクセスとしてのそのユーザー名 (/sbin/nologin に制限されているユーザー apache とは異なります) にも気付きましたが、/etc/passwdそのユーザー名のシェルへのアクセスは sudoers ファイルで制限されています。そのファイル!SHELLはユーザーの sudo 権限の最後に含まれていたので、visudo を使用してそれを削除したところ、動作するようになりました。

関連する Stack Overflow と Server Fault に関するいくつかの投稿を見つけました: onetwothree

3 番目のリンクでは、単純化されたバージョンのメソッドを使用しましたが、シェル スクリプトを指す代わりにシェル コマンドを使用しました。

ファイルのアクセス許可をいじっているため、セキュリティ ホールが残っていないかどうか少し心配です/etc/sudoersが、現時点では、機能するようになったことをうれしく思います。理想的には、コマンドを sudo なしで実行したいのですが、それはより安全だと思われるからです。 .

于 2013-05-26T09:50:57.737 に答える