Tarayıcı üzerinden çalıştırıldığında PHP exec () shell komutu çalıştırmak olmaz

9 Cevap php

Ben JPG PDF dönüştürmek için bir komutu çalıştırmak için exec () çağrıları belirli bir PHP komut dosyası var. Bu komut bash çalışıyor.

Başlangıçtaki giderme tahmin önceden önlemek için aşağıdakilere dikkat edin:

  • safe_mode = Off
  • PDF ve komut 777 ayarlanır ve bu dizini içeren dizinde izni JPG yazılı olan yerlerde aynı zamanda.
  • Ben exec geçirerek komutu () açıkça kullanılan ikili varlık (örneğin / usr / local / bin / convert) işaret eder.
  • display_errors = Açık
  • error_reporting = E_ALL
  • disable_functions = [boş]
  • I exec () 'ın çıkışı yankılanan yaşıyorum ve hiçbir şey döndürür. Varsayılan olarak yürütülüyor komutu hiçbir şey döndürür.

Ben tarayıcıdan bu PHP komut çağırdığınızda (Ziyaret http://www.example.com/script.php), exec () argümanını yürütmek değil.

IMPORTANT: Bash, ben 'php' ile çalıştırabiliriz ve (örneğin, 'php komut çalışır çünkü benim komut dosyası ya da ben bash komutunu inşa ettik yolu ile hiçbir sorunları olduğunu biliyoruz. php ') dosyasına dönüştürür

Ben de) sistemi ile exec () (dışarı geçiş denedim.

Son olarak, ben geçmişte bir kez daha önce bu sorunu vardı ama ben bunu sabit nasıl hatırlamıyorum.

Ben eksik bir şey olduğunu biliyorum, bu yüzden başkası benim gibi bu deneyimli ve bunu düzeltmek için nasıl hatırlar oldu umut!

Eğer sağlayabilir herhangi bir yardım için şimdiden teşekkür ederiz.

Alex

9 Cevap

Stderr'e gelen Stdout hataları yönlendirmek için komutun sonuna 2>&1 Ekle. Bu yanlış neler açıkça yapmalıdır.

Sadece bazı tahminim, bu sizin web sunucusu işlemi kullanıcı bunu ayrıcalıklara sahip olmadığını olabilir.

Bu komut satırı (ki kendi kullanıcı hesabınız altında olacaktır) den çalışır bu yana, (genellikle "www-data") altında web sunucusu çalıştıran hesaba gibi bana geliyor dönüşüm programı yürütmek izinlerini sahip değil .

Apache / webserver kullanıcı kabuk komutu çalıştırmak için gerekli haklara sahip mi?

Eğer cl çalıştırdığınızda muhtemelen eserleri cl hangi açıklayabilir farklı bir kullanıcı olarak değil ama tarayıcı üzerinden çalışan yok.

Dosya izinlerini düşündünüz mü? Tarayıcıda, php bir kullanıcı altında çalışan, ancak bash çalıştırdığınızda, büyük olasılıkla kullanıcı izinleri ile çalışıyor.

Ben kontrol ederim ilk şey.

Amy

Bash ile web sunucusu ve komut dosyası aracılığıyla komut dosyası çalıştıran farklı kullanıcılara nedeniyle olabilir.

Normalde komut / exec user 'www' gibi sunucu üzerinden çağrılır ve bu kullanıcı bölgenizde herhangi bir yazma erişimi yok. Eğer bash komut dosyasını çalıştırdığınızda ama sonra yazma izniniz yok.

Ben bu Imagemagick ile ilgili bir sorun değil, PHP olduğunu tespit ettik. Ben birkaç düzeltmeler çalışılıyor ve onlar işe yaramazsa, ben yerine işi yapmak için bazı PHP paylaşılan kitaplığı (muhtemelen imagick) kullanarak sonuna kadar gidiyorum.

Standart çıkış aygıtı değiştirilir.

(etkinleştirdikten sonra) www olarak giriş değil php, kabuğu ile çıkış verir.

Apache kullanıcı www-data kullanarak bazı uygulamaları çalıştırmak için ayrıcalıkları verilmiş olması gerekir sudo.

  1. Komutunu çalıştırın sudo visudo. Aslında biz etc/sudoers dosyayı düzenlemek istiyorum. Kullanarak, Bunu yapmak için sudo visudo terminalde, o sudoers düzenlemek için dosya (sıcaklık) yinelenen.
  2. At the end of the file, add the following ex: -if we want to use command for restart smokeping and mount command for another action,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(This is assuming that you wish to run restart and mount commands using super user (root) privileges.)

However, if you wish to run every application using super user privileges, then add the following instead of what’s above.You might not want to do that, not for ALL commands, very dangerous.

www-data ALL=NOPASSWD: ALL

3. After edit the sudoers file(by visudo biz sudoers temp dosyasını düzenleyin böylece kaydetmek ve sudoers dosyası yazmak için geçici dosya (visudo) çıkın. ({[(3)] })

4.That 'ın bu, şimdi xxx.php komut dosyası içinde aşağıdaki şekilde exec() kullanın. keep remember to use sudo php komut komut kullanılmadan önce.

ex: -

exec ("sudo /etc/init.d/smokeping restart 2>&1");

Yani sorun, ne istediğiniz gibi php script ben eklemek gibi step no (2.) için kullanmak ve değiştirmek istediğiniz komutları ekleyin.