วิธีแก้ไขข้อบกพร่องของ shell_exec
ตกลงที่นี่เรามีปัญหา: บางอย่างทำงานใน terminal และไม่ทำงานใน shell_exec ของ php (หรือ exec, วางไข่, อะไรก็ตาม) ลองคิดดูว่าคุณและ php ต่างกันอย่างไร ที่นี่มีสาม:
PHP ถูกเรียกใช้จากกฎเซิร์ฟเวอร์ HTTP
อันที่จริงเทอร์มินัลของคุณกำลังทำงานจากyourname
ผู้ใช้และ php ถูกเรียกwww-data
ใช้ ดังนั้นความคิดแรกคือการเปิด terminal จากwww-data
ผู้ใช้และลองคำสั่งเดียวกัน ดังนั้น....
- เปิด
/etc/passwd
แฟ้มค้นหาสอดคล้องกับwww-data
ผู้ใช้และเปลี่ยนมันเปลือกเข้าสู่ระบบ (คนสุดท้าย) จาก/bin/false
(หรืออะไรก็ตาม) /bin/bash
เพื่อ
www-data
เทอร์มินัลของเปิด:su www-data
- ลอง php -v หรืออะไรก็ตามที่คุณไม่สามารถเรียกใช้ได้จาก php ถ้ามันไม่ทำงาน - คุณจะเห็นบันทึกที่ดีและจะสามารถแก้ปัญหาได้
- อย่าลืมแก้ไข
/etc/passwd
ไฟล์ในขณะที่คุณทำเสร็จแล้ว
PHP จะถูกดำเนินการจาก PHP
PHP เป็น paranoid enogh และมีตัวเลือกมากมายในการกำหนดค่า apache / nginx และ php.ini ซึ่งอาจทำลายความพยายามของคุณ
การดีบักค่อนข้างซับซ้อนกว่านี้เล็กน้อย มีสองตัวเลือกที่นี่:
เปิดใช้งานบันทึกในเบราว์เซอร์และดูปัญหา แก้ไขของคุณphp.ini
เปิดdisplay_errors
และตั้งค่าสถานะอื่น ๆ ทั้งหมดเพื่อดูข้อผิดพลาดในเบราว์เซอร์ พวกเขาคุณสามารถอ่านและแก้ไขข้อบกพร่องเหล่านั้น
รับwww-data
เชลล์ (ดูหัวข้อแรก) และดำเนินการบางอย่างเช่น
echo '<?php shell_exec("php -v"); ?>' | php
ซึ่งจะรันโค้ด php เดียวกันในคอนโซลและคุณจะสามารถดูข้อผิดพลาดและการดีบักได้
PHP ถูกเรียกใช้จาก SELinux / apparmor
Selinux และ apparmor เป็นสิ่งด้านความปลอดภัยซึ่งห้ามมิให้แอปพลิเคชันดำเนินการบางอย่าง (ตัวอย่างเช่นการวางไข่แอปพลิเคชันอื่นหรือแอปพลิเคชันอื่น ๆ ที่เฉพาะเจาะจง) อาจเปิดใช้งานบนเซิร์ฟเวอร์ของคุณ
ในการตรวจสอบ - ปิดใช้งาน selinux / apparmor และตรวจสอบว่ามีปัญหาอยู่หรือไม่
ในการแก้ไข - อ่านคู่มือที่เหมาะสมและแก้ไขกฎการอนุญาตให้เขียนสำหรับกรณีของคุณ