1

Debian で php5 からプログラムを実行しようとすると、Web ページがフリーズし、プログラムは何もしません。このスクリプトは、コマンド ラインから呼び出すと機能します。セーフモードが無効になっています。Echo stdout は機能しません (フリーズのため)。wwwのアクセス許可について説明しているGoogleでいくつかの回答を読みましたが、ここの誰かが迅速かつ簡単な回答を持っている場合...

これをデバッグする方法は?

php 呼び出し

exec("expect scripts/sshtest.exp $module");

スクリプト コード (ここで見つかりましたhttp://bash.cyberciti.biz/security/expect-ssh-login-script/ )

#!/usr/bin/expect -f
# set Variables
set module [lrange $argv 0 0]
set timeout -1
# rsync 
spawn rsync -aCb --progress --delete --backup-dir=/var/www/blabla.com/rsyncBackups/BackupedFilesFromServer23_on_  /var/www/blabla/$module  -e ssh root@10.10.10.10:/root/$module
match_max 1000000
# Look for passwod prompt
expect "*?assword:*"
# Send password 
send -- "THEPASSWORD\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof
4

8 に答える 8

1

なぜ期待するのですか?公開鍵/秘密鍵を使用するように rsync をセットアップすると ( http://troy.jdmz.net/rsync/index.htmlを参照)、パスワードを入力する必要がなくなります。

于 2009-06-29T12:36:26.053 に答える
1

私はこれとまったく同じ問題を抱えていて、それが私を夢中にさせていました。私はパーティーに少し遅れていますが、他の誰かがこのスレッドに出くわして同じ問題を抱えている場合に備えて、私の問題を解決した解決策を投稿すると思いました.

私の症状はOPと同じでした。PHP スクリプトを実行すると、Shell_execute を介して Expect スクリプトが開始され、永久にハングアップします。この問題は、Expect スクリプトの実行時に apache ユーザーに尋ねられた次の質問が原因であることが判明しました。

ホスト 'xx.xx.xx.xx (xx.xx.xx.xx)' の信頼性を確立できません。RSA キーのフィンガープリントは xxxxx です。接続を続行しますか (はい/いいえ)?

ホストがホスト リストに追加された場合、この質問は 1 回だけ行われると思われるため、コマンド ラインからスクリプトを実行したときには、この質問は出てきませんでした。

この問題を解決するために、パスワードを入力した場所の前に次のコードを追加しました。

expect "*you sure you want to continue*"
send -- "yes\r"

その結果、次のようになりました (PHP スクリプトが Expect スクリプトからのすべての出力を返すようにしました)。

ホスト 'xx.xx.xx.xx (xx.xx.xx.xx)' の信頼性を確立できません。RSA キーのフィンガープリントは xxxxx です。接続を続行しますか (はい/いいえ)? yes ホストを既知のホストのリスト (/var/www/.ssh/known_hosts) に追加できませんでした。

ただし、その直後にパスワード プロンプトが表示され、パスワードが正しく入力されました。その時点から、Expect スクリプトは正常に実行されました。

于 2010-12-15T02:44:18.123 に答える
1

試す

passthru("expect scripts/sshtest.exp $module 2>&1");

2>&1リダイレクトstderrして代わりにstdout使用すると、すべての出力が得られます。passthruexec

于 2009-06-22T11:20:40.223 に答える
0
  1. パススルーの代わりにexecを使用している場合は、次のようにします。exec( "/ bin / bash -c'command'> logfile_to_read_or_include_next");

  2. 生成されたプロセスでシステムを混乱させたい場合:

リクエストを処理するperl/cスクリプトを作成します。

#!/usr/bin/perl -w
use HTTP::Daemon;
use HTTP::Status;
use strict;
  my $d = HTTP::Daemon->new(LocalPort => 10050) || die;
  print "Please contact me at: <URL:", $d->url, ">\n";
  while (my $c = $d->accept) {
      while (my $r = $c->get_request) {
          if ($r->method eq 'GET' and $r->uri->path =~/addRequest-(.*)$/) {
                # variable $1 now has your request.
                 my $rq = $1; # wash me!
                # assign it a #ID, 
                 my $id = "id".time().rand(100);
                 &run_in_another_thread($rq,$id);
              $c->send_responce($id);
          } elsif ($r->method eq 'GET' and $r->uri->path =~/seeRequest-(.*)$/) {
             $c->send_responce( &get_result_for_id($1) );
          }
          else {
              $c->send_error(RC_FORBIDDEN)
          }
      }
      $c->close;
      undef($c);
  }
}

sub run_in_another_thread {
 my ($rq,$id) = @_;
 my $evil = threads->create( sub { qx"/bin/bash -c '$rq' > logfile_$id.log" # start process
  }->detach();
}

sub get_result_for_id {
 my ($id) = @_;
 return qx"cat logfile_$id.log";
}

次に、コードから127.0.0.1 / addRequest-expectを取得し、出来上がり。

于 2010-09-12T21:41:27.623 に答える
0

もう 1 つの一般的な問題は、コマンドを実行すると、apache がコマンドを実行するときとは別のユーザーになることです。また、多くの場合、ユーザー apache は、セキュリティ上の理由から非常に限られた設定で実行されます。

例えば。apache ユーザーが正しいパスをインストールしていない可能性があります。相対パスではなく、期待する絶対パスを使用してください。これは、'which expect' を実行することで見つけることができます。

Apache を実行するのと同じユーザーに対して「su」を試行し (apache conf ファイルで「User」コマンドを探すか、単に「ps aux」を参照します)、コマンドを実行して、発生するエラーを確認します。

于 2009-06-29T12:27:17.383 に答える
0

PHP がコマンドを実行するために使用している「ユーザー」または「グループ」には、スクリプト内の 1 つのコマンドを実行する権限が不十分な場合があります (またはそれ自体を期待することさえあります)。sudoを使用して、テストしたのと同じユーザーとしてスクリプトを実行しようとしましたか?

于 2009-06-29T12:27:34.730 に答える
0

次のコマンドを入力する前に十分な時間待機すること、およびすべての変数が正しいことを期待してphpに注意してください。2>&1 の使用に関する Greg の指摘により、多くの手間が省けました。

走ってみてください

passthru("expect -d scripts/sshtest.exp $module");

-d 期待してあなたの命を救います。

于 2010-09-12T21:27:43.917 に答える
0

mod___php または suPHP を実行していますか?
mod_php はスクリプトを Apache ユーザーとして実行するため、Apache ユーザーに対して su を実行し、シェル "php scriptname.php" から php スクリプトを実行して、動作するかどうかを確認します。
suPHP を使用している場合は、Apache をセットアップしたユーザーに対して su を実行し、これらのスクリプトを調整して、同じ "php scriptname.php" を実行し、出力を確認します。

于 2009-06-29T12:48:28.887 に答える