ちこっとだけ解説。
今回の行いたいことはリモートサーバへローカルのファイルを全コンテンツ同期させる事。
これを実現するには、
- サーバ側へのSSH接続をパスワードがない方式にする。このときサーバへは、決められたユーザだけがNOPASSWORDを許されるものとする。
- PHPのサーバ権限は(nobody,apache,www...etc)なのでこれを利用することにする。(PHPのWEBアクセスでは、sudoが使えないため・・・)
- シェルのログインユーザで生成された公開鍵など、.sshフォルダをapacheでも使えるようにコピーと移動を行う。(ドキュメントルートへは置かない。)この時.sshフォルダのコピーはログインユーザがするので、オーナーとグループの権限をPHPのサーバ権限のものと一緒にする。
この時、ディレクトリ・ファイルのパーミッションは、0600にしておくことが大事です。 - PHPではクエリをとらず、(クエリをとっても安全のためプログラムとして走らせる部分には使わない。)シェルプログラム単体で動かす。
- 記述)
rsync -avz --delete --exclude='除外するファイルまたはディレクトリ' -e "ssh -i /var/DocumentRoot/hoge/.ssh/" /var/DocumentRoot/ remoteuser@remoteserver:/var/www/hoge/
で、コマンドラインからリモートサーバへ同期するかテスト。
成功するはずです。
成功せずにパスワードを聞かれてします。またはPermissionDeniedが表示される場合は、sshの公開鍵のあるフォルダのowner,group,パーミッションを確認。このフォルダは、ユーザしか使えないようにしておくのを気を使いながら設定します。
Permissionは、0600かな。
自分だけ読み書きできると・・・・
- 以上が主な流れ。次に実際PHPコードを書くことになります。
- PHPでは、基本的にクエリは受け付けずに書いていくことにします。(セキュリティ上念のため)
<?
$cmd = 'rsync -avz --delete --exclude='除外するファイルまたはディレクトリ' -e "ssh -i /var/DocumentRoot/hoge/.ssh/" /var/DocumentRoot/ remoteuser@remoteserver:/var/DocumentRoot/';
shell_exec($cmd);
?>
のような形で記述すれば、動くはずです。
下の記事で少し書いていましたが・・・・
UnderConstruction
昨日が過ぎて今日PHPでリモートサーバに同期するプログラムは無事完成。。
なんとかものになった感じだったけれど、ハマリが痛かった。
これを別のサーバで行うとなると結構サーバをいじることになるので中々linuxとかシステムに精通してないと・・・
プログラム的には難しくないけど・・
要するにSSHでNOPASSWORDでリモートサーバ側に接続できて、PHPのサーバ権限は、(www,nobody,apache...etc)なので、この権限のままNOPASSWORDで使うauthorized_keyをrsyncのsshのところにくっつけてあげると。
そうすると、何とかリモートサーバでの権限も保持されつつ(SSHのログインユーザでのコピー)になるようなのでひとまずは、安心。。
今日は安心だけして、まだ残された課題をクリアしてとりあえずアプリケーションとして動かすと。。
だれか、PHPのコマンド(対話形式)をAjaxとか使ってやったりしてるのかな~?
ウノウの人ならきっと作ってる。w
今日もまた精進ということで。。
詳しい設定なんかは、また次回に。
職人肌では、キーワードマップを作成準備中です。
キーワードマップは、現在のところ旬のキーワードを収集し、ユーザ同士がつながっていくアプリケーションを目指しています。
まだ、完成のめどは、たっていませんが、少しずつ更新していくつもりですのでよろしくお願いいたします。
