[PHP-users 34566] php(コマンドライン版でない!)からrsyncでサイトを同期させる方法
kato @ officeants.net
kato @ officeants.net
2009年 5月 13日 (水) 21:00:18 JST
いつもお世話になっております。
加藤です。
現在の環境につきまして、、、、、
CentOS5 php5.2.6を使用しております。
aaaユーザーにてドメインを運営しております。
サーバーのドキュメントルートは、
/home/aaa/www/trunk/htdocs/
です。
表題の通り、rsync を使用したいと思っております。
■まず、サーバーにてシュミレーションしました。
#su apache
ここでエラー・・・/sbin/nologin=>/bin/bash に変更することでapacheユーザーに
なることができました。
bash-3.2$ su aaa
パスワード:****<<パスワードを入力します。
15秒後くらいにログインできました。
$ cd /tmp
$ rsync --progress --dry-run -azC --force --delete -e " ssh -p 22"
/home/aaa/www/trunk/htdocs パスワード@ホスト:/home/aaa/www/trunk/htdocs
パスワードを聞かれ入力する
・・・実行完了できました。
さて、上記と同様のことをPHPのproc_open()関数等を使用して実行しようと考えまし
た。↓
■下記PHPコードにて実験しました。
$cmd = "rsync --progress $dry_run $parameters -e $ssh ${dir}
${user}@${host}:${dir}";
// 実行するコマンド
$cmds = array(
'su aaa' ,//最初のコマンド
'パスワード',//2番目の〃 (以下略)
'cd /tmp',
$cmd,
$pass,
);
$des = array( 0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"));
$procs = proc_open($cmds[0], $des, $pipes);
$this->ms[] = $cmds[0];
if (is_resource($procs)) {
fwrite($pipes[0], $cmds[1]);
fwrite($pipes[0], $cmds[2]);
fwrite($pipes[0], $cmds[3]);
fwrite($pipes[0], $cmds[4]);
fclose($pipes[0]);
$this->ms[] = '結果 :
<pre>'.stream_get_contents($pipes[1]).'</pre>';
$this->ms[] = 'エラー:
<pre>'.stream_get_contents($pipes[2]).'</pre>';
fclose($pipes[1]);
$this->ms[] = '結果 : <pre>'.proc_close($procs).'</pre>';
}
上記を実行して、$this->msのメッセージを取得すると、
su aaa
結果 :
エラー:
standard in must be a tty
結果 :
1
となりました。
どうも2番目の
su aaa
の後のパスワード入力時にエラーとなっているようです。
どうもこの辺も過去のログにもあまりなかったようでして、もしヒントでもありまし
たら、頂ければ幸いです。
http://www.avant-tokyo.com/solaris/rsync.html
↑こちらに、参考になるページがあったのですが、できればサーバーがレンタルサー
バーであるため、PHP標準の関数内で処理できる方法を模索しております。
どうぞ、よろしくお願いいたします。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
加藤
PHP-users メーリングリストの案内