php shell_exec () การอนุญาตบน Linux Ubuntu


13

ฉันกำลังพัฒนาแอปพลิเคชัน php โดยใช้เซิร์ฟเวอร์ Linux ปัญหาของฉันกำลังshell_exec()เรียกใช้งานไฟล์ exe บางไฟล์ไม่ทำงาน (อันที่จริงไม่ใช่ exe เป็นไฟล์เรียกทำงานของ linux)

echo shell_exec("whoami");

ฉันได้ภูต

echo shell_exec("ls")

ฉันได้รับชื่อไฟล์ แต่

echo shell_exec("php -v")

ฉันไม่มีอะไรเลยหน้าว่าง

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

หน้าว่างด้วย

คำสั่งทั้งหมดเหล่านี้ถ้าฉันพิมพ์บน terminal (user hu) จะใช้งานได้ ฉันค้นหา google เป็นเวลาหลายชั่วโมงผู้คนบอกว่านั่นเพราะได้รับอนุญาต ฉันไม่มีประสบการณ์บน Linux ฉันต้องทำอย่างไรเพื่อรันโปรแกรมใน php?

คำตอบ:


10

ผู้ใช้ของ Apache จำเป็นที่จะต้องได้รับสิทธิพิเศษในการดำเนินการการใช้งานบางอย่างที่ใช้www-datasudo

  1. sudo visudoเรียกใช้คำสั่ง ที่จริงแล้วเราต้องการแก้ไขไฟล์ในเมื่อetc/sudoersต้องการทำเช่นนั้นโดยใช้sudo visudoในเทอร์มินัลจะทำซ้ำsudoersไฟล์(temp) เพื่อแก้ไข
  2. ในตอนท้ายของไฟล์ให้เพิ่ม ex ต่อไปนี้: - ถ้าเราต้องการใช้คำสั่งสำหรับrestartsmokeping และphpคำสั่งสำหรับการกระทำอื่นในคำถามของคุณ

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

(นี่เป็นการสมมติว่าคุณต้องการเรียกใช้restartและphpคำสั่งโดยใช้สิทธิ์ super user (root) และคุณใช้phpคำสั่งในusr/bin/พา ธ )

อย่างไรก็ตามหากคุณต้องการเรียกใช้ทุกแอปพลิเคชันโดยใช้สิทธิ์ผู้ใช้ขั้นสูงให้เพิ่มรายการต่อไปนี้แทนสิ่งที่ด้านบนคุณอาจไม่ต้องการทำเช่นALLนั้น

www-data ALL=NOPASSWD: ALL

3. หลังจากแก้ไขไฟล์ sudoers (โดยvisudoเราแก้ไขไฟล์ temp sudoersดังนั้นให้บันทึกและออกจากไฟล์ temp (visudo) เพื่อเขียนsudoersไฟล์ ( wq!)

4. นั่นคือตอนนี้ใช้exec()หรือshell_execในลักษณะต่อไปนี้ภายในxxx.phpสคริปต์ของคุณ อย่าลืมใช้sudoก่อนที่คำสั่งจะใช้ในสคริปต์ php

เช่น: -

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

หรือ

shell_exec("sudo php -v"); 

ดังนั้นในปัญหาของคุณเพิ่มคำสั่งที่คุณต้องการใช้ในการstep no (2.)ตามที่ฉันเพิ่มและเปลี่ยนสคริปต์ PHP ของคุณเป็นสิ่งที่คุณต้องการ

นี่เป็นปัญหาเดียวกับ/programming//a/22953339/1862107 ของคุณ


คำถามนี้ไม่เกี่ยวกับการใช้ sudo
tricasse

นี่เป็นคำพูดที่แย่มาก
Barney Chambers

5

ลองระบุเส้นทางทั้งหมดไปยัง php binary .. เช่น /usr/bin/php

หากคุณไม่ทราบให้ค้นหาโดยใช้: which php


echo shell_exec ("/ usr / bin / php -v"); ไม่ทำงาน
ngoaho91

เมื่อคุณพูดว่า 'ไม่ทำงาน' คุณจะได้อะไร เช่นมีข้อผิดพลาดใด ๆ มีอะไรในบันทึกข้อผิดพลาด php / apache ของคุณ? หากหน้านั้นว่างเปล่าดูแหล่งที่มาให้อะไรก็ได้ให้คุณทำงานด้วย? น่าเสียดายที่คำว่า 'ไม่ทำงาน' ไม่ได้ช่วยอะไรเราด้วย ...
Keiran Holloway

@ ngoaho91 - /var/log/httpd/error*โดยปกติจะมีการบันทึก
slm

: D ฉันมีหน้าว่างไม่มีอะไรให้ดู ไฟล์บันทึกข้อผิดพลาด php / apache อยู่ที่ไหน
ngoaho91

@ ngoaho91 - distro Linux คืออะไร CentOS, Ubuntu หรือ
slm

4

คุณมักต้องการระบุเส้นทางที่เต็มไปด้วยการใช้งานเช่นwhoami, และls phpหากคุณไม่แน่ใจว่าที่ตั้งของโปรแกรมคืออะไร (เส้นทางแบบเต็ม) คุณสามารถค้นหาได้ดังนี้:

$ type php
php is /usr/bin/php

จากนั้นระบุว่าเป็นเช่นนั้นในสคริปต์ของคุณ

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

ฉันเรียกใช้คำสั่งของคุณ พิมพ์ php => php is / usr / bin / php แต่คำสั่งพา ธ เต็มจะส่งคืนหน้าว่างให้ฉัน
ngoaho91

เกิดอะไรขึ้นถ้าคุณทำเช่นนี้: echo shell_exec("/usr/bin/php somefile.php 2>&1")?
slm

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: ข้อผิดพลาดในการย้ายตำแหน่ง: / usr / bin / php: สัญลักษณ์ X509_free เวอร์ชัน OPENSSL_1.0.0 ไม่ได้กำหนดไว้ในไฟล์ libcrypto so.1.0.0 พร้อมการอ้างอิงเวลาลิงก์
ngoaho91

ตกลงเว็บเซิร์ฟเวอร์ (Apache) huโดยปกติจะทำงานตามที่ผู้ใช้คนอื่นไม่ได้ ดังนั้นคุณต้องให้แน่ใจว่าสคริปต์ที่จะพยายามที่จะมีการตั้งค่าการทำงานเช่นนี้php chmod 755 somescript.phpวิธีนี้จะช่วยให้ผู้ใช้ที่ Apache ใช้งานเพื่อให้สามารถเรียกใช้และอ่าน.phpไฟล์ของคุณได้
slm

1
@ ngoaho91 - ทุกอย่างควรจะดีในขณะนี้ข้อผิดพลาดบอกฉันว่ามีบางอย่างผิดปกติกับการตั้งค่า Apache / PHP ของคุณ freetutorialssubmit.com/php-relocation-error/2221
slm

2

php.ini ของคุณ จำกัด ชุดคำสั่งที่ใช้ได้หรือไม่

นี่คือจากฉัน /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 =

ไม่ฉันก็เหมือนกับคุณ
ngoaho91

2

วิธีแก้ไขข้อบกพร่องของ 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 และตรวจสอบว่ามีปัญหาอยู่หรือไม่

ในการแก้ไข - อ่านคู่มือที่เหมาะสมและแก้ไขกฎการอนุญาตให้เขียนสำหรับกรณีของคุณ


0

สำหรับฉันวิธีที่ง่ายที่สุดคือเข้าไปใน php.ini และแสดงความคิดเห็นบรรทัดที่ขึ้นต้นด้วย

disable_functions
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.