PHP betiği bash betiğini çalıştıramaz. sh: İzin reddedildi


14

Ben PHP değil, bir .sh komut dosyası yürütmek çalışıyorum.

Hata günlüklerini kontrol ettim ve 'sh: İzin verilmedi' hatası alıyorum. Hangi kullanıcı php altında çalıştığını kontrol ettim ve apache kullanıcısı altında yapılır.

Apache kullanıcısına .sh sahipliğini değiştirmeyi denedim, ancak sonuç yok.

İlk başta betiğin www / dir dışında olması nedeniyle olduğunu düşündüm, ancak betiği aynı dizine koyduğumda bile hata hala veriliyor.

Apache kullanıcısını SUDOers listesine eklemek dışında bunun için bir çözüm var mı?

'Php filename.php' komutunu kullanarak macundan çalıştırırsam sh betiği iyi çalışır.


3
Bir kabuk komut dosyası mı yoksa bir PHP dosyası mı? Son paragrafınız bu konuda net değil. Ayrıca, xdosya üzerinde yürütme izinleri ( ) ayarladınız mı? Senaryo tercümanını bir shebang satırında mı belirtdiniz?
Daniel Beck

PHP'den çalıştırılacak bir bash betiğidir. Evet, çalıştırılabilir yaptım ve kod yorumlayıcısını belirttim. Ben macun PHP betiği yürüttüğünüzde doğru çalışır ve bash betiği çağırır ve doğru çalışır. Ama webbrowser php betiği çalıştırmak yerine bunun yerine bash betiği çalıştırmak için başarısız ve macun kullandığım kullanıcı değil apache kullanıcı olarak çalıştığı için bu hatayı yapacaktır.
Robin Presto

1
Deneyin chmod 775 yourscript.sh. Bu r-x, o dosyadaki "Diğer" kullanıcılara izin verir (okur ve yürütür).
Rhyuk

Denedim. Şans yok .. Yarına kadar sebebini tam olarak bilemiyorum. Konumumdan günlüklere erişimim yok. Size geri döneceğim çocuklar. Yardımın için teşekkürler. :)
Robin Presto

Yanıtlar:


10

Aşağıdaki önerileri deneyin:

  • Test komutunun altında çalıştırmayı deneyin ve çalışıp çalışmadığını kontrol edin:
    • php -r "echo exec('whoami');"
  • Tüm üst dizinlerin ve dosyaların en az r-xbayrak iznine sahip olduğundan emin olun :
    • chmod 755 dir; chmod 755 file
  • Dosyanın sahibinin Apache kullanıcısı olduğundan emin olun .
    • Ayrıca +sdosyaya bir bayrak (sudo) eklemeyi deneyin (önerilmez):
      • chmod u+s file,
  • PHP'nizin bir safe_mode.
  • Komut dosyasının Apache kökünüzün içinde olduğundan emin olun:
    • Aksi takdirde, komut dosyasını içine taşıyın,
    • veya bu dizini Apache yapılandırmanıza ekleyin,
    • veya bu dizini bilgisayarınıza ekleyin include_path, örneğin:
      • php.ini dosya: include_path ".:/usr/local/lib/php:/your/dir"
      • veya .htaccessdosya:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Kabuğunuzun /bin/shApache kullanıcınız için geçerli (örneğin ) olup olmadığını kontrol edin (örneğin: ile kontrol edin finger).
  • Senin emin olun php.inikullanmaz: disable_functionsiçin execfonksiyonun
  • SELinux kullanıyorsanız veya selinux-utilsyüklüyse (Güvenliği geliştirilmiş bir Linux sistemi), @Tonin yanıtında açıklandığı gibi kontrol edin getenforce/ setenforceyapılandırın .

Sorun giderme:

  • Dosyanızı php.iniveya httpd.confdosyanızı değiştirdiyseniz , web sunucusunu yeniden başlatmayı unutmayın,
  • Ek ayrıntılar için Apache hata günlüğünüze bakın.
  • Senin içinde etkinleştirme php.inihataları (her türlü display_error, error_reportingvb.)

1
Bu benim sorunumdu ... üst dizinin yürütme hakları yoktu ... şimdi çalışıyor! Teşekkür ederim! :)
Robin Presto

Benim için hala şans yok :( Herhangi bir öneri? `` [Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / sleep; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 kök kök 4096 Eylül 3 12:31 / drwxrwxrwt.4 kök kök 4096 Eyl 3 15:45 / tmp -rwxr-xr-x. 1 kök kök 24 Eyl 3 15:39 / tmp / sleep safe_mode = Kapalı include_path = "/ tmp: / home / kiwi_build" ``
pihentagy

1
Argh, setenforce çözdü. OMG
pihentagy

13

Böyle bir sorun kullandığınız işletim sistemine ve nasıl yapılandırıldığına bağlı olabilir. Bazı linux dağıtımları (ağırlıklı olarak CentOS veya Fedora gibi RHEL tabanlı olanlar) SELinux varsayılan olarak etkinleştirilmiştir. Bu, aşağıdaki komutlarla kontrol edilebilir ve geçici olarak değiştirilebilir:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Geçerli yapılandırma hakkında aşağıdakilerle daha eksiksiz bir görünüm elde edebilirsiniz:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Bu değişiklik, /etc/selinux/configdosyayı düzenleyerek ve SELINUXdeğişkeni permissiveveya olarak ayarlayarak kalıcı yapılabilir disabled.

Ancak, bu tür bir sorunu çözmenin doğru yolu , eğer gerçekten bu durumdaysanız, /var/log/audit/audit.loggünlük dosyasını kontrol etmektir . SELinux kuralları ile ilgili tüm olayları içerecektir. O zaman muhtemelen betiğinize doğru bağlamı vermelisiniz, yani apache / php kullanıcısı tarafından çalıştırılma yetkisine sahip olmalısınız. SELinux güvenlik bağlamının kontrol edilmesi ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Bu, her dosyanın / dizinin Kullanıcı, Rol ve Türünü listeler. Burada httpd_sys_script_exec_ttür cgi dizinindeki dosyalara httpd tarafından yürütülmesine izin verir. Kabuk betiğiniz muhtemelen aynı türde olmalıdır.

audit.logSatırları audit2allowkomuta da besleyebilirsiniz . SELinux'u mutlu etmek için gereken değişiklikleri size verecektir. Ancak genellikle önerilen değişikliklerin sizin durumunuzda yapmanız gerekmeyen SELinux politikasının kendisinde yapılması gerekir (yine de, bu çıktı neler olup bittiğine dair bir ipucu verebilir).

Aşağıdaki sayfada benzer bir sorun ve sorunu çözmenin farklı yolları açıklanmaktadır: http://sheltren.com/stop-disabling-selinux


Ayrıntılı cevap için teşekkür ederim! Ne yazık ki, bahsettiğim gibi yarına kadar root erişimim olamaz. Ben de sana geri döneceğim! :) Ve evet, CentOS kullanıyorum.
Robin Presto

Cevabınızı çok sevdim, çok bilgilendirici! Ne yazık ki seninkini seçmedim çünkü zorlama devre dışı bırakıldı ve sorun değildi. Cevabınızdan çok şey öğrenmiş olmama rağmen, teşekkür ederim. Yeteri kadar itibar kazandığımda sana oy vereceğim :)
Robin Presto

Endişeye gerek yok, yazımdan öğrendiğini öğrendiğime sevindim!
Tonin

Eğer sorun güçlenirse, halkanın neler olduğu gerçekten açık değildir. Günümü kurtardı!
pihentagy

1

Google'da benzer bir sorunu aradıktan sonra buraya geldim. SELinux hakkındaki yorumun beni doğru yöne çektiğini düşündüm.

Kendi durumumda, bir kabuk komutu kullanan özel bir Git dağıtma komut dosyası kullanıyordum. Komut, BASH'da iyi çalışıyor ancak Git'te "izin reddedildi" ve "havuz değil". Bu gerçekten garipti ve bu cevabı tökezleyene kadar birden fazla düzeltmeden geçtim.

root@ls:~# /usr/sbin/setenforce Permissive sorunu benim için çözdü.


0

Durumum biraz farklı, ama Google beni buraya getirdi, bu yüzden paylaşacağımı düşündüm ...

Sunucum debian kararlı çalışıyor ve bir kez çalıştı bir kabuk komut dosyası yürütmek için çalışıyor sonra izinleri otomatik olarak 644 olarak değiştirildi ve komut dosyasını çalıştırmak için bir sonraki girişim var Permission denied. Benim için bir samba sunucusu sorunu olduğu ortaya çıktı ve şimdiye kadar deseni fark etmedim.

KG Strange izni, bir Windows düzenleyicisinden bir Samba bölümüne dosya kaydedilirken değişiklik yapıldı. map archive = noOn yıl boyunca samba hisselerini kullandıktan sonra bile seçeneği bilmiyordum .

Windows masaüstünde Notepad ++ kullanma hakkında bir şey, umask için ayarlandığı için hedef dosyaların izinlerini 775 yerine 675 olarak değiştirir.


-7

Apache üzerinden PHP'de root komutlarını çalıştırma

Ben bir PHP işlevi içinde kök olarak kabuk komutları gerçekleştirmek için gereken bir web uygulaması var ve bu oldukça düz olacağını düşünürdüm ... ama tüm ayrıntıları almak için benim birkaç googles aldı, bu yüzden burada benim kullanışlı notlar o. Bu, Apache çalıştıran bir Linux sisteminde ve komutları çalıştırmak için “shell_exec” içinde “sudo” kullanacağız.

Ana şey / etc / sudoers dosyasını düzenlemek ve genellikle (root olarak) bunu yapmak için ”visudo” komutunu kullanabilirsiniz.

Apache'nin komutları çalıştırabildiğinden VE bir şifre gerektirmediğinden emin olun:

apache  ALL=(ALL)       NOPASSWD: ALL

O zaman bu satırı yorumlamanız gerekir:

#Defaults    requiretty

Bunu yapmazsanız, / var / log / secure dizininde şu hataları görürsünüz: “özür dilerim, sudo'yu çalıştırmak için bir tty'niz olmalıdır”. Artık hazırsınız ve PHP kodu basit:

$ results = shell_exec ('sudo date');


5
Bu korkunç bir fikir. Apache kurulumunuz tehlikeye girerse veya çalıştırdığınız uygulama yaparsa ... bilgisayar korsanınız sisteme çok kolay erişir. Doğru olan şey, senaryodaki izinleri değiştirmek, şeyleri açık bırakmamaktır
Journeyman Geek

2
Apache kullanıcısına / rolüne tüm izinleri vermekle ilgili bariz güvenlik kaygıları nedeniyle bu cevabı düşürmek zorunda hissediyorum.
Ramhound

@JourneymanGeek "if" değil , kurulum tehlikeye girdiğinde .
Michael Hampton
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.