Saya mencoba menjalankan skrip Python dari PHP menggunakan perintah berikut:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
Namun, PHP tidak menghasilkan keluaran apa pun. Pelaporan kesalahan disetel ke E_ALL dan display_errors aktif.
Inilah yang saya coba:
- Saya menggunakan
python2
,/usr/bin/python2
danpython2.7
sebagai gantinya/usr/bin/python2.7
- Saya juga menggunakan jalur relatif alih-alih jalur absolut yang juga tidak mengubah apa pun.
- Saya mencoba menggunakan perintah
exec
,shell_exec
,system
.
Namun, jika saya lari
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
itu bekerja dengan baik sementara shutdown now
tidak melakukan apapun.
PHP memiliki izin untuk mengakses dan mengeksekusi file.
EDIT: Terima kasih kepada Alejandro, saya bisa memperbaiki masalah. Jika Anda mengalami masalah yang sama, jangan lupa bahwa server web Anda mungkin / mudah-mudahan tidak berjalan sebagai root. Coba masuk sebagai pengguna server web Anda atau pengguna dengan izin serupa dan coba jalankan perintah sendiri.
Jawaban:
Diuji di Ubuntu Server 10.04. Saya harap ini juga membantu Anda di Arch Linux.
Dalam PHP gunakan fungsi shell_exec :
Dalam file Python
test.py
, verifikasi teks ini di baris pertama: (lihat shebang menjelaskan) :Juga file Python harus memiliki hak yang benar (eksekusi untuk pengguna www-data / apache jika skrip PHP berjalan di browser atau curl) dan / atau harus "dapat dieksekusi". Juga semua perintah ke dalam
.py
file harus memiliki hak istimewa yang benar:Diambil dari manual php :
Untuk membuat file yang dapat dieksekusi pada platform tipe unix :
sumber
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
atau:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Saya merekomendasikan menggunakan
passthru
dan menangani buffer keluaran secara langsung:sumber
Jika Anda ingin mengetahui status kembalian dari perintah dan mendapatkan seluruh
stdout
output, Anda sebenarnya dapat menggunakanexec
:$out
adalah larik dari semua baris.$status
adalah status pengembalian. Sangat berguna untuk debugging.Jika Anda juga ingin melihat
stderr
hasilnya, Anda dapat bermain dengan proc_open atau menambahkannya2>&1
ke file$command
. Yang terakhir ini seringkali cukup untuk membuat segala sesuatunya bekerja dan cara yang lebih cepat untuk "diimplementasikan".sumber
Alejandro berhasil, menambahkan klarifikasi ke pengecualian (Ubuntu atau Debian) - Saya tidak memiliki perwakilan untuk menambahkan jawaban itu sendiri:
file sudoers:
sudo visudo
pengecualian ditambahkan:
www-data ALL=(ALL) NOPASSWD: ALL
sumber
Untuk memperjelas perintah mana yang akan digunakan berdasarkan situasi
exec()
- Jalankan program eksternalsystem()
- Jalankan program eksternal dan tampilkan hasilnyapassthru()
- Jalankan program eksternal dan tampilkan keluaran mentahSumber: http://php.net/manual/en/function.exec.php
sumber
Dalam kasus saya, saya perlu membuat folder baru di
www
direktori bernamascripts
. Di dalamscripts
saya menambahkan file baru bernamatest.py
.Saya kemudian menggunakan
sudo chown www-data:root scripts
dansudo chown www-data:root test.py
.Lalu saya pergi ke
scripts
direktori baru dan menggunakansudo chmod +x test.py
.File test.py saya terlihat seperti ini. Perhatikan versi Python yang berbeda:
Dari php saya sekarang melakukan ini:
Dan Anda akan melihat: Halo Dunia!
sumber
Metode di atas sepertinya rumit. Gunakan metode saya sebagai referensi.
Saya memiliki dua file ini:
run.php
mkdir.py
Di sini, saya telah membuat halaman HTML yang berisi GOtombol. Setiap kali Anda menekan tombol ini, folder baru akan dibuat di direktori yang jalurnya telah Anda sebutkan.
run.php
mkdir.py
sumber
Ini sangat sepele, tetapi hanya ingin membantu siapa saja yang telah mengikuti saran Alejandro tetapi mengalami kesalahan ini:
Jika ada yang mengalami kesalahan itu, maka sedikit perubahan perlu dilakukan pada file php oleh Alejandro:
sumber