[PHP-users 34567] Re: php(コマンドライン版でない!)からrsyncでサイトを同期させる方法

大家正登 masato_oie @ ybb.ne.jp
2009年 5月 13日 (水) 23:54:40 JST


加藤さん
こんにちは、大家です。

>standard in must be a tty

このエラーメッセージが原因で詰まってるように見受けられました。
これは私が解釈するに・・「su コマンドのパスワードを入力する
standard in (標準入力)は tty(端末)じゃないといけない」って
意味かと思います。

で、

>$des	= array(	0 => array("pipe", "r"),
>	1 => array("pipe", "w"),
>	2 => array("pipe", "w"));

の0番目で子プロセスが読み込むパイプの標準入力を指定
しているので、それに対して

>    fwrite($pipes[0], $cmds[1]); 
($cmds[1] はパスワードですよね?) 
のようにしているのがエラーの原因じゃないかと思います。

解決策についてですが残念ながら試してないので何とも
いえないのですが・・例えば私ならシェルスクリプトに
コマンドを書いて、それを shell_exec とかで実行すると
いう方法で再チャレンジすると思います。

パスワードの入力は・・うーん、使ったことないのですが
例えば expect コマンドとかありますが
http://www.linux.or.jp/JM/html/expect/man1/expect.1.html
こういったものを使うとか。。
(これも同じエラーになっちゃいますかね??)

あまり参考になる情報でなくてすいません。
※このあたりの正しい知識はありませんから
識者の方はどんどん指摘して頂ければ幸いです。

あくまでご参考程度に。よろしくおねがいします。

>いつもお世話になっております。
>加藤です。
>
>現在の環境につきまして、、、、、
>  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 mailing list  PHP-users @ php.gr.jp
>http://ml.php.gr.jp/mailman/listinfo/php-users
>PHP初心者のためのページ - 質問する前にはこちらをお読みください
>http://oldwww.php.gr.jp/php/novice.php3

□■□───────────────────→
 システムエンジニア
 大家正登 (OIE, Masato)
 E-Mail: masato_oie @ ybb.ne.jp
←───────────────────■□■


PHP-users メーリングリストの案内