2012-06-15 23 views
41

dan ben komut satırı üzerinden böyle yayınlanması için, bir bash komut dosyası var.çalıştırın Bash Komuta PHP

Ya şimdi var olduğunu:

$output = shell_exec("./script.sh var1 var2"); 
echo "<pre>$output</pre>"; 

Ama işi gelmiyor.Fark. exec ve system kullanarak da denedim, ancak betik hiç çalıştırılmadı.

Ancak, shell_exec("ls");'u çalıştırmaya çalıştığımda, çalışır ve $output tüm dosyaların bir listesidir.

Kullanmakta olduğum VPS'nin bir kısıtlaması nedeniyle mi, yoksa sorun başka bir yerde mi olduğundan emin değilim?

+1

Hangi yolu çalıştırıyorsunuz? pwd' ne döndürüyor? – alex

+1

Komut dosyanız, "apache" veya "www-data" kullanıcısıyla çalıştırılabilir mi? – core1024

+2

Bu betik betiği PHP betiğinizle aynı dizinde mi? Php betiğinin çalışma dizini aynı dizinde de var mı? –

cevap

58

Komut dosyası çağırılmadan önce doğru dizine chdir gerekir. "bölümündeki" kabuk komutunu çağırmadan önce.

$old_path = getcwd(); 
chdir('/my/path/'); 
$output = shell_exec('./script.sh var1 var2'); 
chdir($old_path); 
+0

Sanırım bu hile yaptı! En azından basit bir test komut dosyası ile çalıştım. Sonunda doğrulamak için, sunucu sahibinin komut dosyalarının tam yolunu bilmesini beklemek zorundayım. Yine de cevabı işaretleyeceğim. Teşekkürler! – Andrej

+0

@Andrej: Veya göreceli olanı yerine komut dosyanızın mutlak yolunu kullanın. –

+0

@Andrej PHP 5.3 çalıştırıyorsanız, dizini komut dizini içeren dizine değiştirmek için chdir (__ DIR __) 'kullanabilirsiniz. Veya PHP 5.2 veya daha az için, 'dirname (__ FILE __)' hile yapacaktır. –

5

Shell_exec'iniz, www-data kullanıcısı tarafından dizinden yürütülür. Sen komut Daha sonra size /home/kullanıcı/bin bulunur

putenv("PATH=/home/user/bin/:" .$_ENV["PATH"].""); 

$output = "<pre>".shell_exec("scriptname v1 v2")."</pre>"; 
echo $output; 

komutunun çıktısını görüntülemek için olabilir deneyebilirsiniz. (Alternatif olarak, dışa aktarma yolu olmadan, komut dosyanızın tam yolunu vermek yerine yalnızca ./script.sh

+0

'PATH' ortam değişkenini değiştirmek gereksiz. Mevcut çalışma dizini bunun yerine değiştirilmelidir (bkz. [Yanıtım] (http://stackoverflow.com/a/11052453/24950)). –

+1

Doğru. Teşekkürler. Kodumdaki yol ayarlarını kullanıyordum çünkü birden fazla konumda çeşitli özel yürütülebilir dosyalara sahibim ve giriş kutusunun bir konsol olarak çalışmasını istedim, böylece bunlardan herhangi bir komutu çağırıyorum. Sadece tek dosya yürütme için kullanılacaksa, sadece shell_exec ('/ complete/path/to/file /'); – Hrishikesh

0

Check sadece alacak etki alanınız ve php dizindeki. O irade hapis ne kullanmak php.ini veya etki alanının .htaccess bir open_basedir'inizi ayarlamamışsanız Bu dizinin içinde yürütme erişimi