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」を作成できませんでした。ホストキーの検証に失敗しました。致命的:リモートエンドが予期せずハングアップした
ディレクトリ「/.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番目のユーザーを確立すると、一定レベルの分離が提供されます。
あなたは2つの密接に関連した問題を抱えているようです:
ユーザーApacheは、その~/.ssh
ディレクトリの通常の場所に書き込むことができないため、実行されています(CentOS Apacheのホームディレクトリは/
であり、Webサーバーがどこにでも置くことは望ましくありません。ファイルシステムに必要です)。
Githubは、あなたを認証するための公開鍵を必要としています。
これらの両方のケースを処理できるはずの修正があります。git
はGIT_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回実行する場合は、インタラクティブなプロンプトを処理しないでください。
実行:
Sudo -u Apache ssh YOURGITHOST
基本的に、ApacheユーザーはリモートサーバーのSSHホストキーが何であるかを認識していないため、受け入れるように要求することはできません。これを行う方法は他にもありますが、これが私が最もよく覚えている方法です。
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は問題なく機能しました。
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ファイルを実行できるブラウザから動作します。コードが更新されます
私はあなたと同じ質問に出会う。そして私は以下をしようとします
Sudo -u Apache ssh-keygen -t rsa
そしてキーのパスがcmd画面に表示されます。cat id_rsa.pub
、キーをコピーしてgithubまたはgitlabに投稿しますSudo -u http ssh <git Host>
、git Host多分github.comまたはgitlab.com-