izin php shell_exec () di Linux Ubuntu

13

Saya sedang mengembangkan aplikasi php menggunakan server Linux. Masalah saya adalah mengeksekusi shell_exec()untuk memanggil beberapa file exe tidak berfungsi (sebenarnya tidak exe, ini semacam file executable linux)

echo shell_exec("whoami");

Saya mendapat daemon

echo shell_exec("ls")

Saya punya beberapa nama file tetapi

echo shell_exec("php -v")

Saya tidak mendapatkan apa-apa, halaman kosong

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

halaman kosong juga.

Semua perintah ini jika saya mengetik di terminal (user hu) akan berfungsi. Saya telah mencari Google selama beberapa jam, orang-orang mengatakan itu karena izin. Saya tidak punya pengalaman di Linux. Apa yang harus saya lakukan untuk menjalankan program saya di php?

ngoaho91
sumber

Jawaban:

10

Pengguna Apache www-dataperlu diberikan hak istimewa untuk menjalankan aplikasi tertentu menggunakan sudo.

  1. Jalankan perintah sudo visudo. Sebenarnya kami ingin mengedit file etc/sudoers. Untuk melakukannya, dengan menggunakan sudo visudodi terminal, itu menduplikat (temp) sudoersfile untuk diedit.
  2. Di akhir file, tambahkan contoh berikut: -jika kami ingin menggunakan perintah untuk restartmerokok dan phpmemerintahkan tindakan lain dalam pertanyaan Anda,

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

(Ini dengan asumsi bahwa Anda ingin menjalankan restartdan phpperintah menggunakan hak pengguna super (root). Dan Anda menggunakan phpperintah di usr/bin/jalur)

Namun, jika Anda ingin menjalankan setiap aplikasi menggunakan hak pengguna super, maka tambahkan yang berikut daripada apa yang di atas. Anda mungkin tidak ingin melakukan itu, bukan untuk ALLperintah, sangat berbahaya.

www-data ALL=NOPASSWD: ALL

3. Setelah mengedit file sudoers (oleh visudokami mengedit file temp sudoersjadi simpan dan keluar file temp (visudo) untuk menulis dalam sudoersfile. ( wq!)

4. Hanya itu, sekarang gunakan exec()atau shell_execdengan cara berikut di dalam xxx.phpskrip Anda . tetap ingat untuk menggunakan sudosebelum menggunakan perintah dalam skrip php.

ex:-

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

atau

shell_exec("sudo php -v"); 

Jadi dalam masalah Anda, tambahkan perintah yang ingin Anda gunakan di step no (2.) saat saya menambahkan dan mengubah skrip php Anda seperti yang Anda inginkan.

di sini adalah masalah yang sama seperti milikmu /programming//a/22953339/1862107

Demikianlah Sumanadasa
sumber
Pertanyaan ini bukan tentang menggunakan sudo.
tricasse
Ini sangat buruk
Barney Chambers
5

Coba tentukan seluruh path ke biner php .. Misalnya, /usr/bin/php

Jika Anda tidak mengetahuinya, temukan menggunakan: which php

Keiran Holloway
sumber
echo shell_exec ("/ usr / bin / php -v"); tidak bekerja
ngoaho91
ketika Anda mengatakan 'tidak berhasil' apa yang Anda dapatkan? Yaitu, ada kesalahan? Ada yang ada di log kesalahan php / apache Anda? Jika halaman kosong, sumber tampilan memberi Anda sesuatu untuk dikerjakan? Sayangnya istilah 'tidak berfungsi' tidak memberi kita apa - apa untuk digunakan ...
Keiran Holloway
@ ngoaho91 - biasanya log-nya /var/log/httpd/error*.
slm
: D saya punya halaman kosong, tidak ada yang bisa dilihat. di mana file log kesalahan php / apache?
ngoaho91
@ ngoaho91 - distro Linux apa ini? CentOS, Ubuntu?
slm
4

Biasanya Anda ingin menentukan jalur penuh untuk aplikasi seperti whoami, ls, dan php. Jika Anda tidak yakin apa lokasi program (path lengkap), Anda bisa mengetahui seperti:

$ type php
php is /usr/bin/php

Kemudian sebutkan seperti di skrip Anda.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>
slm
sumber
saya menjalankan perintah Anda. ketik php => php adalah / usr / bin / php. tetapi perintah path lengkap masih mengembalikan saya halaman kosong.
ngoaho91
Bagaimana jika Anda melakukan ini echo shell_exec("/usr/bin/php somefile.php 2>&1"):?
slm
echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: kesalahan relokasi: / usr / bin / php: simbol X509_gratis, versi OPENSSL_1.0.0 tidak didefinisikan dalam file libcrypto. so.1.0.0 dengan referensi waktu tautan
ngoaho91
OK, server web (Apache) biasanya berjalan sebagai pengguna lain, bukan hu. Jadi, Anda perlu memastikan bahwa script phpberupaya untuk jangka diatur seperti ini: chmod 755 somescript.php. Ini akan memungkinkan pengguna yang menjalankan Apache, untuk dapat mengeksekusi & membaca .phpfile Anda .
slm
1
@ ngoaho91 - semuanya harus baik-baik saja sekarang, kesalahan itu memberitahu saya ada sesuatu yang salah dengan pengaturan Apache / PHP Anda. freetutorialssubmit.com/php-relokasi-error/2221
slm
2

Apakah php.ini Anda membatasi set perintah yang tersedia?

Ini dari saya /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 =
X Tian
sumber
tidak, ini saya sama dengan milik Anda
ngoaho91
2

Cara men-debug masalah shell_exec

OK, di sini kita punya masalah: beberapa hal bekerja di terminal dan tidak berfungsi di shell_exec php (atau exec, spawn, apa pun). Mari kita pikirkan: apa perbedaan antara Anda dan php? Inilah tiga:

PHP dijalankan dari aturan server HTTP

Memang, terminal Anda berjalan dari yournamepengguna dan php dijalankan dari www-data. Jadi, ide pertama adalah membuka terminal dari www-datapengguna dan mencoba perintah yang sama. Begitu....

  • Buka /etc/passwdfile, temukan baris dengan www-datapengguna dan ubah shell login-nya (yang terakhir) dari /bin/false(atau apa pun) menjadi /bin/bash.
  • Terbuka www-data's terminal:su www-data
  • Coba php -v atau apa pun yang tidak dapat Anda jalankan dari php. Jika tidak berhasil - Anda akan melihat log yang bagus dan dapat men-debug masalah.
  • Jangan lupa untuk memperbaiki kembali /etc/passwdfile saat Anda selesai

PHP dijalankan dari PHP .

PHP adalah enogh paranoid dan ada banyak opsi dalam konfigurasi apache / nginx dan php.ini yang dapat merusak upaya Anda.

Ini sedikit lebih rumit untuk di-debug. Ada dua opsi di sini:

  • Aktifkan log di browser dan lihat masalahnya. Edit Anda php.ini, nyalakan display_errorsdan semua bendera lainnya untuk melihat kesalahan di browser. Mereka Anda dapat membaca dan men-debug mereka.

  • Dapatkan www-datashell (lihat bagian pertama) dan jalankan sesuatu seperti

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

yang akan mengeksekusi kode php yang sama di konsol dan Anda akan dapat melihat kesalahan dan debug.

PHP dijalankan dari SELinux / apparmor

Selinux dan apparmor adalah hal-hal keamanan yang melarang aplikasi untuk melakukan tindakan tertentu (misalnya, menelurkan aplikasi lain atau beberapa aplikasi spesifik lainnya). Mungkin itu diaktifkan di server Anda.

Untuk memeriksa - menonaktifkan selinux / apparmor dan memeriksa apakah ada masalah.

Untuk memperbaiki - baca manual yang sesuai dan perbaiki aturan permisif tulis untuk kasus Anda.

Arenim
sumber
0

Bagi saya cara paling sederhana adalah masuk ke dalam php.ini dan berkomentar di baris yang dimulai dengan

disable_functions
Alex
sumber