Nasıl kullanmak için bir php web sayfasının komut bekliyor?

6 Cevap php

When i try to execute a program from php5 on my debian, the webpage freeze and the program do nothing. This script works when i call it from the command line. Safe mode is disabled. Echo stdout doesnt work (because of the freeze). I read some answers in google which tells of www permissions but if someone here have a quick and simple response...

Bu hata ayıklama nasıl?

The php call

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

The script code (which i found here 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

6 Cevap

Denemek

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

2>&1 yönlendirmeleri stderr için stdout kullanılarak passthru yerine exec size tüm çıktı verecektir.

Ben bu aynı sorun vardı ve bu beni deli ediyordu. Ben partiye biraz geç kaldım, ama ben başkası bu konuya genelinde gelir ve aynı sorun var durumda benim sorunu çözüldü çözüm göndeririz düşündüm.

Benim belirtiler OP olarak aynıydı. Ben PHP script çalıştırmak istiyorum, bu shell_execute yoluyla Expect senaryoyu tekmelemek istiyorum, ve sonra sadece sonsuza kadar askıda. Sorun nedeniyle Expect komut çalıştırdığınızda apache kullanıcıya istendi ediliyordu şu soruya olduğu ortaya çıktı:

The authenticity of host 'xx.xx.xx.xx (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xxxxx. Are you sure you want to continue connecting (yes/no)?

Ben konak konak listesine eklenir eğer soru sadece bir kez sordu inanıyorum çünkü komut satırından komut dosyası çalıştırdığınızda, bu soru benim için gelmek olmaz.

Sorunu gidermek için, ben şifre girilen noktada önce bu kodu ekledi:

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

Yani (Ben benim PHP komut Expect komut çıkış tüm dönmek vardı) bu sonuçlandı:

The authenticity of host 'xx.xx.xx.xx (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xxxxx. Are you sure you want to continue connecting (yes/no)? yes Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).

Ancak, doğrudan doğruya bundan sonra şifre istemi geldi ve şifre doğru girildi. Bu noktadan itibaren Beklentileriniz komut ince koştu iletin.

Başka bir ortak yakalamak size komutu çalıştırdığınızda apache komutu çalıştığında farklı bir kullanıcı olmasıdır. Çok güvenlik nedenleriyle kurmak sınırlı gibi ve sık sık, kullanıcı apache çalışır.

örn. Apache kullanıcı doğru yolları yüklü olmayabilir. Göreli değil beklemek mutlak yolunu kullanın. Sen beklediğimiz 'çalıştırarak bu bulabilirsiniz.

(Apache conf dosyasında 'Kullanıcı' komutuyla aramak veya basitçe 'ps aux' göz) gibi aynı kullanıcı apache pistlerine 'su' çalışın ve komutunu çalıştırın ve ne olsun hataları görüyorum.

"Kullanıcı" ya da "grup" PHP komutları exec kullanarak komut bir cmd yürütmek (ve hatta kendisini beklemek) yetersiz haklara sahip olabilir. Eğer ile test edilmiş, aynı kullanıcı olarak komut dosyasını çalıştırmak için sudo kullanarak denediniz mi?

Eğer tüm değişkenleri doğru olduğunu da bir sonraki komuta koymadan önce yeterince uzun süre beklemek ve o php içinde bekliyoruz dikkatli olun. 2> & 1 kullanarak Greg'in işaretçi bana sorunsuz bir sürü kurtardı.

try running

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

-D bekliyoruz hayatınızı kurtaracak.

  1. If you're using exec instead of passthru, do it in this way: exec("/bin/bash -c 'command' > logfile_to_read_or_include_next");

  2. Eğer olurken süreçleri ile karışıklık sisteminizi istiyorsanız:

perl / c senaryo yazmak, bu senin isteklerini işlemek olacaktır.

#!/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";
}

Ardından, kod 127.0.0.1/addRequest-expect olsun, ve işte ..