Linux Ubuntu'da php shell_exec () izni


13

Linux sunucusu kullanarak bir php uygulaması geliştiriyorum. Benim sorunum shell_exec()bazı exe dosyası çalışmıyor (aslında exe değil, bu tür linux yürütülebilir dosya) aramak için yürütme

echo shell_exec("whoami");

Arka planım var

echo shell_exec("ls")

Dosyam var ama

echo shell_exec("php -v")

Hiçbir şeyim yok, boş bir sayfa

echo shell_exec("php ....bla bla bla")

boş bir sayfa.

Terminalde (user hu) yazdığımda tüm bu komutlar çalışır. Birkaç saat boyunca google'da arama yaptım, insanlar izin nedeniyle bunu söylüyor. Linux'ta deneyimim yok. Php programımı yürütmek için ne yapmam gerekir?

Yanıtlar:


10

Apache kullanıcısına www-datakullanarak belirli uygulamaları yürütmek için ayrıcalık tanınmalıdır sudo.

  1. Komutu çalıştırın sudo visudo. Aslında dosyayı bizde düzenlemek istiyoruz etc/sudoers. Bunu yapmak için, sudo visudoterminalde kullanarak sudoersdosyayı düzenlemek için (temp) çoğaltın .
  2. Dosyanın sonuna şu ex komutunu ekleyin: - restartsigara içmek için komut kullanmak ve sorunuzdaki phpbaşka bir işlem için komut kullanmak istiyorsak ,

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

(Bu, süper kullanıcı (kök) ayrıcalıklarını kullanarak çalıştırmak restartve phpkomutlar vermek istediğinizi varsayar ve yoldaki phpkomutu kullanırsınız usr/bin/)

Ancak, her uygulamayı süper kullanıcı ayrıcalıkları kullanarak çalıştırmak istiyorsanız, yukarıda belirtilenler yerine aşağıdakileri ekleyin. Bunu yapmak istemeyebilirsiniz, ALLkomutlar için değil , çok tehlikeli.

www-data ALL=NOPASSWD: ALL

3. Sudoers dosyasını visudodüzenledikten sonra ( sudoersbu yüzden kaydedin ve temp dosyasına (visudo) geçici dosyasını düzenleyerek sudoersdosyaya yazın. ( wq!)

4. İşte bu, şimdi exec()veya betiğinizde shell_execaşağıdaki şekilde kullanın xxx.php. php betiğinde komut kullanmadan sudoönce kullanmayı unutmayın .

örn: -

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

veya

shell_exec("sudo php -v"); 

Bu yüzden sorununuzda, kullanmak istediğiniz komutları step no (2.)ekleyin ve eklediğim gibi php betiğinizi istediğiniz gibi değiştirin.

seninkiyle aynı problem burada /programming//a/22953339/1862107


Bu soru sudo kullanmakla ilgili değil.
tricasse

Bu çok kötü bir şekilde ifade edildi
Barney Chambers

5

Php ikili yolun tamamını belirtmeyi deneyin .. Örn. /usr/bin/php

Eğer bilmiyorsanız, şunu kullanarak bulun: which php


echo shell_exec ("/ usr / bin / php -v"); çalışmıyor.
ngoaho91

'işe yaramaz' dediğinde ne elde edersin? Yani, herhangi bir hata var mı? Php / apache hata günlüklerinizde bir şey var mı? Sayfa boşsa, kaynağı görüntüle ile çalışabileceğiniz herhangi bir şey var mı? Ne yazık ki 'işe yaramıyor' terimi bize çalışmak için hiçbir şey vermiyor ...
Keiran Holloway

@ ngoaho91 - günlükleri genellikle /var/log/httpd/error*.
slm

: Boş bir sayfam var, görülecek bir şey yok. php / apache hata günlük dosyası nerede?
ngoaho91

@ ngoaho91 - bu hangi Linux dağıtımı? CentOS, Ubuntu?
slm

4

Genelde gibi uygulamalara tam yollarını belirtmek istediğiniz whoami, lsve php. Bir programın konumunun (tam yol) ne olduğundan emin değilseniz şu şekilde öğrenebilirsiniz:

$ type php
php is /usr/bin/php

Ardından komut dosyanızda böyle belirtin.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

emrini ben çalıştırıyorum. php => php / usr / bin / php şeklindedir. ancak tam yol komutu bana yine de boş bir sayfa döndürüyor.
ngoaho91

Bunu yaparsanız ne olur echo shell_exec("/usr/bin/php somefile.php 2>&1")?
slm

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: yer değiştirme hatası: / usr / bin / php: sembol X509_free, sürüm OPENSSL_1.0.0 dosya libcrypto'da tanımlanmadı. Bağlantı zamanı referansı ile so.1.0.0
ngoaho91

Tamam, web sunucusu (Apache) genellikle başka bir kullanıcı olarak çalışıyor, değil hu. Yani emin komut olmak gerekir phpböyle ayarlanır vadede çalışıyor: chmod 755 somescript.php. Bu, Apache'nin çalıştığı kullanıcının .phpdosyanızı yürütebilmesini ve okuyabilmesini sağlar .
slm

1
@ ngoaho91 - şimdi her şey iyi olmalı, bu hata bana Apache / PHP kurulum w / yanlış bir şey olduğunu söylüyor. freetutorialssubmit.com/php-relocation-error/2221
slm

2

Php.ini dosyanız mevcut komut kümesini kısıtlıyor mu?

Bu benim /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

hayır, benim ini
seninkiyle

2

Shell_exec Sorunları Nasıl Hata Ayıklanır

Tamam, burada bir sorunumuz var: bir şey terminalde çalışıyor ve php'nin shell_exec'inde (veya exec, spawn, neyse) çalışmıyor. Düşünelim: Siz ve php arasındaki fark nedir? İşte üç:

PHP HTTP sunucusu kurallarından yürütülür

Gerçekten de, terminaliniz yournamekullanıcıdan çalışıyor ve php çalıştırılıyor www-data. İlk fikir, terminali www-datakullanıcıdan açmak ve aynı komutu denemektir. Yani....

  • /etc/passwdDosyayı açın , www-datakullanıcıyla satır bulun ve giriş kabuğunu (sonuncusu) /bin/false(veya herhangi bir şekilde) olarak değiştirin /bin/bash.
  • Open www-dataterminali:su www-data
  • Php -v ya da php'den yürütemediğiniz her şeyi deneyin. Eğer işe yaramazsa - Güzel günlükler görürsünüz ve sorunu hata ayıklayabilirsiniz.
  • /etc/passwdİşiniz bittiğinde dosyayı düzeltmeyi unutmayın

PHP, PHP'den yürütülür .

PHP paranoyak enogh ve apache / nginx ve php.ini yapılandırmasında denemenizi bozabilecek birçok seçenek var.

Bu hata ayıklamak için biraz daha karmaşıktır. Burada iki seçenek var:

  • Tarayıcıda günlükleri etkinleştirin ve sorunu görün. Tarayıcıda hataları görmek için Kendinizi düzenleyin php.ini, açın display_errorsve diğer tüm bayraklar. Onları okuyabilir ve hata ayıklayabilirsiniz.

  • www-dataKabuğunu edinin (ilk bölüme bakın) ve benzeri bir şey yürütün

echo '<?php shell_exec("php -v"); ?>' | php

Bu aynı php kodunu konsolda çalıştıracak ve hataları ve hata ayıklamalarını görebileceksiniz.

PHP SELinux / apparmor tarafından yürütülür

Selinux ve apparmor, uygulamaların belirli eylemleri gerçekleştirmesini yasaklayan güvenlik unsurlarıdır (örneğin, diğer uygulamaları yumurtlama veya diğer belirli uygulamaları). Belki sunucunuzda etkindir.

Kontrol etmek - selinux / apparmor'u devre dışı bırakın ve sorunun olup olmadığını kontrol edin.

Düzeltmek için - uygun el kitabını okuyun ve davanız için izin veren kuralları yazın.


0

Benim için en basit yol php.ini içine girmek ve ile başlayan satırı yorumlamak oldu

disable_functions
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.