[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 メーリングリストの案内