web-dev-qa-db-ja.com

PHPスクリプトからgit pullを実行する

Git、GitHub、SSHを使用した完璧なワークフロー を試していましたが、git pullを実行できないようです。私はgit statusを試しましたが、問題ありません。

git pull 2>&1を取得すると、次のようになります。

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

私は運が悪いので777に.git dirをchmodしようとしました。

ブラウザからwhoamiを実行すると、次のように表示されます:Apache

---編集---

私はchown Apache:apache -R .gitを実行しました。

ディレクトリ「/.ssh」を作成できませんでした。ホストキーの検証に失敗しました。致命的:リモートエンドが予期せずハングアップした

5
AFRC

ディレクトリ「/.ssh」を作成できませんでした。ホストキーの検証に失敗しました。致命的:リモートエンドが予期せずハングアップした

エラーメッセージを読んで検討してください。ホストキーは〜/ .ssh/known_hostsファイルに保存されます。 Apacheユーザーのホームディレクトリには「/」がありますが、ルートへの書き込みアクセス権は絶対にありません。

このためのユーザーアカウントを作成することをお勧めします...多分gitpull-userまたは何か。どこか変わった場所であっても、使用可能なホームディレクトリがあることを確認してください。そのユーザーとしてログインし、そのユーザーとして実行しようとしていることを実行するシェルスクリプトを作成します。もちろん、適切なid_rsaキーをユーザーのアカウントなどにコピーする必要もあります。

この行を/ etc/sudoersに追加して、そのスクリプトを起動するようにSudoを構成します。

Apache ALL = (gitpull-user) NOPASSWD: /path/to/script.sh`

また、「No TTY」の問題が発生している場合:

Defaults:Apache !requiretty

PHPスクリプトをSudo -u gitpull-user ./script.shを呼び出すように変更します


Apacheのホームディレクトリを「実際の」場所に変更してそこにキーをドロップすることは可能ですが、データをApacheが所有する必要があり、デーモンが侵害された場合にキーが読み取られるリスクがあります。 。 2番目のユーザーを確立すると、一定レベルの分離が提供されます。

5
Jeff Ferland

あなたは2つの密接に関連した問題を抱えているようです:

  1. ユーザーApacheは、その~/.sshディレクトリの通常の場所に書き込むことができないため、実行されています(CentOS Apacheのホームディレクトリは/であり、Webサーバーがどこにでも置くことは望ましくありません。ファイルシステムに必要です)。

  2. Githubは、あなたを認証するための公開鍵を必要としています。

これらの両方のケースを処理できるはずの修正があります。gitGIT_SSH環境変数(設定されている場合)を使用して、「ssh」として実行するコマンドを決定するため、次のことを行う必要があります。その環境変数を調整して、SSHに2つのことを伝えます。そのknown_hostsファイルを探す場所と、認証に使用する公開鍵.

追加
export GIT_SSH="ssh -oUserKnownHostsFile=/some/path/to/known_hosts -i /some/path/to/private_key"
スクリプトと物事にはず正常に動作します(私の例では、Apacheが書き込むことができるパスをダミーパスに置き換えてください)。

known_hostsファイルを作成して入力するには、Apacheユーザーとしてリモートホストに1回接続する必要があることに注意してください。コマンドラインからスクリプトを実行し、起動時に対話型プロンプトを処理することで、これを行うことができます。スクリプトを2回実行する場合は、インタラクティブなプロンプトを処理しないでください。

0
voretaq7

実行:

Sudo -u Apache ssh YOURGITHOST

基本的に、ApacheユーザーはリモートサーバーのSSHホストキーが何であるかを認識していないため、受け入れるように要求することはできません。これを行う方法は他にもありますが、これが私が最もよく覚えている方法です。

0
devicenull

WebサーバーPHPスクリプトでもexec()を使用してGITリポジトリからプルしようとしました。リモートリポジトリは別のユーザーの下で読み取り専用でチェックアウトされました。

私の主な問題は、WebサーバーPHPスクリプトを実行すると、PULLからのEXEC結果変数が完全に空になったということでした。ただし、単純な「git help」は機能しました。

問題を修正したのは次のとおりです。

最初に、リポジトリディレクトリのwebserveruser所有者を作成します。

chown -R <webserveruser>:<webusergroup> <repodir>

通常、webserverユーザーにログインできないため、最初にシェルを割り当てました。

usermod -s /bin/bash <webserveruser>

ウェブサーバーユーザーとしてログイン:

su <webserveruser>

次に、リポジトリディレクトリに移動し、手動でプルします。

cd <repodir>
git pull

Webサーバーユーザーを終了し、rootに戻って、Webサーバーユーザーのシェルを再度無効にします。

exit
usermod -s /bin/false <webserveruser>

奇妙に聞こえますが、その後、Webサーバースクリプトを使用した読み取り専用のPULLは問題なく機能しました。

0
Deckard

Sshの代わりにhttpsを使用している場合は、リクエストでユーザー/パスワードを直接指定できます。

git clone:

$output = Shell_exec ("git clone https://user:[email protected]:user/repo.git");

git pull:

$output = Shell_exec("git pull https://user:[email protected]:user/repo.git");

サンプルphpコード

<?php

$outputs =  Shell_exec('git pull https://user:[email protected]:user/repo.git master');
echo "<pre>$outputs</pre>";
?>

$outputs最後のコミット結果が表示されます。

次に、プロジェクトフォルダの権限を追加します

chown -R <webserveruser>:<webusergroup> <repodir>

Apacheサーバーを再起動します。

Sudo service Apache2 restart 

phpファイルを実行できるブラウザから動作します。コードが更新されます

0
Kishore

私はあなたと同じ質問に出会う。そして私は以下をしようとします

  1. httpexecuteの「役割」を知っておく必要があります。あなたの「アパッチ」のように
  2. sshキーを作成しますSudo -u Apache ssh-keygen -t rsaそしてキーのパスがcmd画面に表示されます。
  3. パスに移動し、cat id_rsa.pub、キーをコピーしてgithubまたはgitlabに投稿します
  4. 最後に、サーバーがgitサーバーのホストを知らないためです。したがって、以下を行う必要があります。
    Sudo -u http ssh <git Host>、git Host多分github.comまたはgitlab.com
    コマンドを使用した後、「yes」と入力します。そして、サーバーが「known_hosts」という名前のファイルを「.ssh /」に作成することがわかります
  5. Php exec( 'git pull Origin master')を試すには、問題ありません。

-

0
user3043832