Skrip PHP tidak dapat menjalankan skrip bash. sh: Izin ditolak

14

Saya mencoba untuk mengeksekusi skrip .sh dari PHP, namun tidak dieksekusi.

Saya memeriksa log kesalahan, dan saya mendapatkan kesalahan 'sh: Izin ditolak'. Saya memeriksa di mana pengguna php sedang dijalankan, dan itu dilakukan di bawah pengguna apache.

Saya mencoba mengubah kepemilikan .sh kepada pengguna apache, tetapi tidak ada hasilnya.

Saya pikir pada awalnya ini karena skrip berada di luar www / dir, namun bahkan ketika saya meletakkan skrip di direktori yang sama, kesalahan masih diberikan.

Apakah ada solusi untuk ini selain menambahkan pengguna apache ke daftar SUDOers?

Script sh berfungsi dengan baik jika saya meluncurkannya dari dempul menggunakan perintah 'php filename.php'.

Robin Presto
sumber
3
Apakah ini skrip shell atau file PHP? Paragraf terakhir Anda tidak jelas tentang itu. Juga, apakah Anda menetapkan mengeksekusi izin ( x) pada file? Apakah Anda menentukan penerjemah skrip dalam baris shebang?
Daniel Beck
Ini adalah skrip bash untuk dijalankan dari PHP. Ya saya membuatnya menjadi executable dan saya memang menentukan juru bahasa script. Ia bekerja dengan benar ketika saya menjalankan skrip PHP dari dempul dan skrip bash dipanggil dan berjalan dengan benar. Tetapi jika saya menjalankan skrip php dari webbrowser alih-alih gagal menjalankan skrip bash dan ia akan melakukan kesalahan ini karena skrip ini berjalan sebagai pengguna apache dan bukan pengguna yang saya gunakan di dempul.
Robin Presto
1
Coba chmod 775 yourscript.sh. Itu akan memberikan r-x(membaca dan mengeksekusi) izin untuk pengguna "Lain" pada file itu.
Rhyuk
Saya mencobanya. Tidak beruntung .. Aku tidak tahu alasan pasti sampai besok. Saya tidak memiliki akses ke log dari lokasi saya. Saya akan kembali kepada kalian. Terima kasih untuk bantuannya. :)
Robin Presto

Jawaban:

10

Coba saran berikut:

  • Coba jalankan perintah pengujian di bawah ini, dan periksa apakah itu berhasil:
    • php -r "echo exec('whoami');"
  • Pastikan bahwa semua direktori induk dan file memiliki setidaknya r-xizin bendera:
    • chmod 755 dir; chmod 755 file
  • Pastikan bahwa pemilik file adalah pengguna Apache Anda .
    • Coba juga untuk menambahkan +sflag (sudo) ke file (tidak disarankan):
      • chmod u+s file,
  • Pastikan PHP Anda tidak berjalan di a safe_mode.
  • Pastikan skrip berada di dalam root Apache Anda:
    • Kalau tidak, pindahkan skrip di dalamnya,
    • atau tambahkan direktori itu ke konfigurasi Apache Anda,
    • atau tambahkan direktori ini ke Anda include_path, misalnya:
      • php.ini mengajukan: include_path ".:/usr/local/lib/php:/your/dir"
      • atau .htaccessfile:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Periksa apakah shell Anda disetel ke valid (mis. /bin/sh) Untuk pengguna Apache Anda (mis. Periksa dengan finger:).
  • Pastikan Anda php.initidak menggunakan: disable_functionsuntuk execfungsi
  • Jika menggunakan SELinux atau telah selinux-utilsmenginstal (sistem Linux yang disempurnakan dengan Keamanan), periksa getenforce/ setenforcekonfigurasi seperti dijelaskan dalam jawaban @Tonin .

Penyelesaian masalah:

  • Jika Anda mengubah php.iniatau httpd.conffile Anda, jangan lupa untuk me-restart server web,
  • Periksa log kesalahan Apache Anda untuk detail tambahan.
  • Aktifkan di Anda php.inisemua jenis kesalahan ( display_error, error_reporting, dll).
kenorb
sumber
1
Itu masalah saya .. direktori induk tidak memiliki hak eksekusi ... itu berfungsi sekarang! Terima kasih! :)
Robin Presto
Masih tidak beruntung bagi saya :( Ada saran? `` `[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 root 4096 Sep 3 12:31 / drwxrwxrwt 4 root 4040 Sep 3 15:45 / tmp -rwxr-xr-x. 1 root root 24 Sep 3 15:39 / tmp / sleep safe_mode = Tidak aktif include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy
1
Argh, setenforce menyelesaikannya. OMG
pihentagy
13

Masalah seperti itu mungkin tergantung pada OS yang Anda gunakan dan bagaimana hal itu dikonfigurasi. Beberapa distro linux (terutama yang berbasis pada RHEL seperti CentOS atau Fedora) datang dengan SELinux diaktifkan secara default. Ini dapat diperiksa, dan sementara diubah, dengan perintah berikut:

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

Anda juga dapat memiliki tampilan yang lebih lengkap tentang konfigurasi saat ini dengan:

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

Perubahan ini dapat dibuat permanen dengan mengedit /etc/selinux/configfile dan mengatur SELINUXvariabel ke permissiveatau disabled.

Tapi, cara yang benar untuk menyelesaikan masalah seperti ini , jika Anda memang dalam situasi ini, adalah dengan memeriksa /var/log/audit/audit.logfile log. Ini akan berisi semua acara yang terkait dengan aturan SELinux. Maka Anda mungkin harus memberikan naskah Anda konteks yang benar, yaitu diizinkan untuk dijalankan oleh pengguna apache / php. Memeriksa konteks keamanan SELinux dilakukan dengan 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 ..

Ini daftar Pengguna, Peran dan Jenis setiap file / direktori. Di sini httpd_sys_script_exec_ttipe memberikan file dalam direktori cgi izin untuk dieksekusi oleh httpd. Script shell Anda mungkin harus memiliki tipe yang sama.

Anda juga bisa memberi makan audit.loggaris ke audit2allowperintah. Ini akan menampilkan Anda perubahan yang diperlukan untuk membuat SELinux bahagia. Tetapi biasanya perubahan yang disarankan perlu dilakukan pada kebijakan SELinux itu sendiri yang bukan apa yang harus Anda lakukan dalam kasus Anda (masih, output ini dapat memberikan petunjuk tentang apa yang sedang terjadi).

Halaman berikut menjelaskan masalah yang serupa dan berbagai cara untuk menyelesaikannya: http://sheltren.com/stop-disabling-selinux

Tonin
sumber
Terima kasih atas balasan terinci! Sayangnya, seperti yang saya sebutkan saya tidak dapat memiliki akses root sampai besok. Jadi aku akan membalasmu juga! :) Dan ya, saya menggunakan CentOS.
Robin Presto
Saya menyukai jawaban Anda, sangat informatif! Sayangnya saya tidak memilih Anda karena penegakan dinonaktifkan dan bukan masalahnya. Meskipun saya belajar banyak dari jawaban Anda, jadi terima kasih. Saya akan memilih Anda ketika saya mendapatkan reputasi yang cukup :)
Robin Presto
Jangan khawatir, senang mengetahui Anda belajar dari pos saya!
Tonin
Jika dilanggar adalah masalahnya, maka sebenarnya tidak jelas apa yang sedang terjadi. Itu menyelamatkan hari saya!
pihentagy
1

Jadi saya sampai di sini setelah mencari masalah serupa di Google. Saya berpikir untuk menjatuhkan bahwa komentar tentang SELinux menunjuk saya ke arah yang benar.

Dalam kasus saya sendiri, saya menggunakan skrip deploy Git kustom yang menggunakan perintah shell. Perintah berfungsi dengan baik pada BASH tetapi kemudian memiliki "izin ditolak" dan "bukan repositori" di Git. Ini benar-benar aneh dan saya mengalami beberapa perbaikan sampai saya menemukan jawaban ini.

root@ls:~# /usr/sbin/setenforce Permissive memecahkan masalah bagi saya.

Bade Adesemowo
sumber
0

Situasi saya sedikit berbeda, tetapi Google membawa saya ke sini, jadi saya pikir saya akan membagikan ...

Server saya menjalankan stabil debian dan mencoba untuk mengeksekusi skrip shell berfungsi sekali maka izin secara otomatis berubah menjadi 644 dan upaya berikutnya untuk menjalankan skrip didapat Permission denied. Ternyata masalah server samba bagi saya dan saya tidak melihat pola sampai sekarang.

Izin QA Strange berubah ketika menyimpan file pada partisi Samba dari editor Windows adalah perbaikannya. Saya tidak tahu tentang map archive = noopsi bahkan setelah menggunakan saham samba selama satu dekade.

Sesuatu tentang menggunakan Notepad ++ di desktop Windows akan mengubah izin file target menjadi 675 alih-alih 775 saat umask diatur.

Chris K
sumber
-7

Menjalankan perintah root di PHP melalui Apache

Saya memiliki aplikasi web yang perlu melakukan perintah shells sebagai root di dalam fungsi PHP, dan Anda akan berpikir itu akan sangat mudah ... tapi memang butuh beberapa googles saya untuk mendapatkan semua detail, jadi di sini adalah catatan berguna saya di Itu. Ini ada di sistem Linux yang menjalankan Apache, dan kita akan menggunakan "sudo" di dalam "shell_exec" untuk menjalankan perintah.

Hal utama adalah mengedit file / etc / sudoers, dan biasanya Anda dapat (sebagai root) menggunakan perintah "visudo" untuk melakukannya.

Pastikan apache dapat menjalankan perintah, DAN tidak memerlukan kata sandi:

apache  ALL=(ALL)       NOPASSWD: ALL

Maka Anda perlu mengomentari baris ini:

#Defaults    requiretty

Jika tidak, maka Anda akan melihat kesalahan ini di / var / log / secure: "maaf, Anda harus memiliki tty untuk menjalankan sudo". Sekarang Anda siap untuk pergi, dan kode PHPnya sederhana:

$ results = shell_exec ('sudo date');

متعب المغيري
sumber
5
Ini ide yang buruk . Jika instalasi apache Anda dikompromikan atau aplikasi yang Anda jalankan ... hacker Anda terlalu mudah mengakses sistem. Hal yang benar adalah mengubah izin pada skrip, tidak membiarkan semuanya terbuka lebar
Journeyman Geek
2
Saya merasa berkewajiban untuk mengeluarkan downvote pada jawaban ini karena masalah keamanan yang jelas dengan memberikan pengguna apache / peran semua izin.
Ramhound
@JourneymanGeek Ini bukan "jika", itu ketika instalasi mendapat kompromi.
Michael Hampton