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