Debian: ฆ่าเซสชันบนหน้าจอผ่านเว็บ


1

ฉันมีรหัส PHP ที่เป็นดังนี้ (kill.php):

<?php echo exec("/home/duke/aa/scripts/test.sh");  ?>

test.sh มีลักษณะเช่นนี้:

screen -S server -X quit

ถ้าฉันเรียกใช้โค้ด php ในเทอร์มินัลphp screen -S server -X quitสคริปต์จะฆ่าเซสชันหน้าจอ

อย่างไรก็ตามถ้าฉันชี้เว็บเบราว์เซอร์ของฉันไปที่http: //mywebsite/test.phpมันจะแสดง "ไม่พบเซสชันหน้าจอ" และจะไม่ฆ่าเซสชันของหน้าจอ ฉันจะทำอย่างไรเพื่อให้เว็บเบราว์เซอร์ทำงานได้

คำตอบ:


1

การกำหนดค่าเริ่มต้นคือการเรียกใช้หน้า PHP ทั้งหมด (และคำสั่งที่ปรากฏ) ในฐานะwww-dataผู้ใช้ซึ่งหมายความว่าพวกเขามีสิทธิ์เข้าถึงเซสชันที่เป็นเจ้าของwww-dataเท่านั้น

คุณต้องเรียกใช้สคริปต์ภายใต้บัญชีผู้ใช้ของคุณเองซึ่งสามารถทำได้โดย:

  • ใช้sudo; ตัวอย่างเช่นรายการsudoersต่อไปนี้:

    www-data: ALL=(duke) NOPASSWD: /home/duke/aa/scripts/test.sh

    จะช่วยให้คุณเรียกใช้ exec("sudo -u duke /home/duke/aa/scripts/test.sh");

  • หรือติดตั้งsuPHP : สคริปต์ PHP จะทำงานภายใต้บัญชีของเจ้าของ


ตัวอย่างปัจจุบันของคุณเรียกใช้สคริปต์สองครั้งซึ่งอาจมีผลข้างเคียงต่างๆ กำจัดexec()สายที่สอง- หรือดีกว่าใช้system()หรือpassthru()แทน - หากคุณต้องการแสดงผลลัพธ์ของสคริปต์


เซสชันเป็นเจ้าของโดยรูท ฉันควรแก้ไขรายการ sudoers ด้วยหรือไม่ ดังนั้นในกรณีของฉันฉันจะทำ exec ("sudo -u root /path/to/.sh")?
dukevin

@Kevin: ถูกต้อง แม้ว่าจะrootเป็นค่าเริ่มต้นสำหรับsudoดังนั้นคุณสามารถใช้sudo /path/to/.shในกรณีนี้
grawity

คุณกรุณาอธิบายว่าฉันจะแก้ไขรายการ sudoers ของฉันได้อย่างไร
dukevin

@Kevin: แทนที่(duke)ด้วย(root)และแก้ไขพา ธ . sh หากจำเป็น
grawity

ฉันสามารถวางที่www-data: ALL=(root) NOPASSWD: /home/duke/aa/scripts/test.shใดก็ได้ในรายการ sudoers?
dukevin

1

ฉันคิดว่าสาเหตุคือคุณเริ่มเซสชันหน้าจอในฐานะผู้ใช้อื่นมากกว่าผู้ใช้เว็บเซิร์ฟเวอร์ของคุณ (อาจเป็นไปได้www-data) แต่เนื่องจากสคริปต์จะทำงานในฐานะผู้ใช้เว็บเซิร์ฟเวอร์ของคุณเมื่อเริ่มต้นผ่านเบราว์เซอร์จึงไม่มีสิทธิ์ส่งคำสั่ง ไปยังเซสชันหน้าจอของผู้ใช้รายอื่น

วิธีแก้ไขปัญหานี้ขึ้นอยู่กับการเริ่มต้นเซสชันหน้าจอของคุณ หากเป็นไปได้ที่จะเริ่มต้นในฐานะผู้ใช้เว็บเซิร์ฟเวอร์นี่จะเป็นทางออกที่ง่ายที่สุด แต่ตัวเลือกอื่น ๆ อาจรวมถึง sudo หรือมาตรการที่ซับซ้อนกว่า (*) บอกเราเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังทำเพื่อให้เราสามารถให้คำแนะนำที่เป็นประโยชน์

(*) ฉันเห็น "วิธีแก้ปัญหา" สำหรับปัญหาประเภทนี้ซึ่งสคริปต์ PHP จะเขียนไฟล์พิเศษซึ่งตรวจพบโดย cronjob ที่เริ่มทำงานมันก็ต่อเมื่อไฟล์นั้นปรากฏ ...


SvenW เซสชันหน้าจอเริ่มต้นด้วยบัญชีรูทดังนั้นฉันจึงแก้ไขโค้ด php ให้มีลักษณะเช่นนี้exec("sudo /home/duke/aa/scripts/test.sh");อย่างไรก็ตามยังไม่มีโชค คำแนะนำอื่น ๆ ก่อนที่ฉันจะลองเริ่มเซสชันด้วย www-data?
dukevin

คุณใส่ www-data ไว้ในไฟล์ sudoer หรือไม่?
Sven

ใช่นี่คือสิ่งที่ไฟล์ sudoer ของฉันดูเหมือนว่า: pastebin.com/HMKw72Z8
dukevin

1
@Kevin: sudoด้วยตัวเองไม่ได้เปลี่ยนสภาพแวดล้อมของผู้ใช้อย่างสมบูรณ์เช่นลองsudo who am iและคุณจะยังคงได้รับข้อมูลเกี่ยวกับผู้ใช้เดิมและ pty แต่คุณสามารถบอกที่ผู้ใช้ในการใช้งานเช่นscreen screen -r sessionowner
ทอมชอว์

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