เรียกใช้เชลล์สคริปต์ด้วยปุ่ม html


12

ฉันต้องการเปิดใช้งาน bash script เมื่อมีการกดปุ่มบนเว็บไซต์ นี่เป็นความพยายามครั้งแรกของฉัน:

<button type="button" onclick="/path/to/name.sh">Click Me!</button>

แต่ไม่มีโชค ข้อเสนอแนะใด ๆ

แก้ไข - ทำตามคำแนะนำของ slhclk และ mit:

ฉันมีไฟล์ php ใน / var / www ที่ฉันชี้ไปที่เว็บเบราว์เซอร์ของฉัน เนื้อหาของไฟล์มีดังนี้:

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

tesh.sh มีสิ่งนี้:

screen -S server1 -X quit

หากฉันพิมพ์/home/aa/scripts/test.shในเชลล์สคริปต์จะสามารถดำเนินการได้ อย่างไรก็ตามเมื่อฉันชี้เว็บเบราว์เซอร์ไปที่http://example.com/screen.php (ซึ่งมีรหัสด้านบน) ฉันเห็นหน้าว่างและสคริปต์ไม่ได้ดำเนินการ ทั้งสองมีสิทธิ์ดำเนินการ ทำไมมันไม่ทำงาน


มันน่าสนใจที่จะทราบว่าเว็บเซิร์ฟเวอร์ประเภทนี้คืออะไร ตัวอย่างเช่นมันอาจเป็นเซิร์ฟเวอร์ linux ที่บ้านเครื่อง windows ที่มี XAMPP หรือข้อเสนอโฮสติ้งเว็บไซต์มาตรฐานที่มีชื่อโดเมนจาก hoster ขนาดใหญ่
mit

ฉันอยู่ที่เด
เมี่ยนเลนนี่

1
นี่คือซ้ำของสิ่งนี้แม้ถามโดยผู้ใช้คนเดียวกัน ">> stackoverflow.com/questions/6235785/ …ที่ฉันโพสต์คำตอบการทำงานของฉันรู้สึกว่าพวกเขาควรจะเชื่อมโยง
FreeSoftwareServers

คำตอบ:


11

สิ่งที่คุณพยายามทำนั้นเป็นไปไม่ได้

โปรดทราบว่ามีสองด้านเสมอไป: ฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ เป็นสคริปต์บนคอมพิวเตอร์ไคลเอนต์หรือบนเซิร์ฟเวอร์หรือไม่


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

ลองคิดดูสิ: เบราว์เซอร์จะรู้วิธีเปิดไฟล์ได้อย่างไร คุณไม่คิดว่านี่เป็นปัญหาด้านความปลอดภัยเช่นกัน - เว็บไซต์ธรรมดาที่เปิดใช้งานสคริปต์ในคอมพิวเตอร์ของลูกค้าหรือไม่ เกิดอะไรขึ้นถ้ามีบางอย่างเช่นonClick('rm -rf /home/user')?

อีกทางเลือกหนึ่งคือการเรียกใช้แอปเพล็ต Java ถ้าคุณต้องการให้โค้ดรันบนไคลเอนต์ แต่สิ่งนี้ไม่เหมือนกันและเป็นสิ่งที่ซับซ้อนจริงๆ ฉันไม่คิดว่าจำเป็นต้องอธิบายรายละเอียดนี้


หากสคริปต์อยู่บนเซิร์ฟเวอร์:หากคุณต้องการเรียกใช้สคริปต์ทางฝั่งเซิร์ฟเวอร์และให้ผู้ใช้ทำการเรียกใช้งานคุณต้องใช้ภาษาโปรแกรมฝั่งเซิร์ฟเวอร์ HTML เพียงอย่างเดียวไม่สามารถทำได้เนื่องจากเป็นไฟล์แบบคงที่หรือมากกว่า หากคุณต้องการโต้ตอบกับเซิร์ฟเวอร์คุณสามารถใช้PHPได้

มันมีexecฟังก์ชั่นในการเรียกใช้สคริปต์บรรทัดคำสั่งที่เก็บไว้ในเว็บเซิร์ฟเวอร์ โดยพื้นฐานแล้วคุณสามารถเขียนexec('/path/to/name.sh');และจะเรียกใช้สคริปต์บนเซิร์ฟเวอร์

อย่างไรก็ตามการใส่ลงไปonClickนี้ไม่เพียงพอที่นี่ หากคุณยังไม่รู้เกี่ยวกับ PHP และการเขียนโปรแกรมเว็บฝั่งเซิร์ฟเวอร์คุณอาจต้องการอ่านบทช่วยสอนก่อนแล้วค่อยกลับมาพร้อมคำถามเฉพาะเพิ่มเติม


หากคุณมีไฟล์ PHP กับที่เหมาะสมexec(...)คำสั่งให้ตรวจสอบสคริปต์ที่มีผู้สิทธิ์ตั้งไม่เพียง แต่สำหรับผู้ใช้ 777แต่ยังสำหรับกลุ่มเว็บเซิร์ฟเวอร์อยู่ในดังนั้นในกรณีที่ง่ายเพียงแค่

ในกรณีที่มีปัญหาให้ตรวจสอบค่าส่งคืนของสคริปต์ด้วยecho exec(...);เพื่อดูว่ามีข้อผิดพลาดหรือไม่

php /path/to/file.phpนอกจากนี้คุณยังสามารถเรียกใช้สคริปต์จากบรรทัดคำสั่งและไม่ได้มาจากเบราว์เซอร์ที่มี


ขอบคุณมากสำหรับคำตอบอย่างละเอียด เชลล์สคริปต์อยู่ในคอมพิวเตอร์ของฉัน ฉันกำลังลองสิ่งที่คุณเขียน แต่ฉันพบปัญหา ฉันได้แก้ไขคำถามของฉันด้านบน
dukevin

ตกลงนี่เป็นปัญหาที่แตกต่างกันไปแล้ว คุณติดตั้ง PHP จริงหรือไม่? พยายามที่จะได้รับรหัสการกลับมาของสายโดยการเขียนexec echo exec(...);นอกจากนี้โปรดทราบว่าสคริปต์ต้องการสิทธิ์ดำเนินการสำหรับกลุ่มที่เว็บเซิร์ฟเวอร์ของคุณทำงานไม่ใช่แค่ผู้ใช้ของคุณ
slhck

ใช่ฉันมี chmod 777 ทั้งสองไฟล์ และฉันพยายามรัน php โดยตรงจากเชลล์ด้วยผลลัพธ์แปลก ๆ pastebin.com/eU0xTkp2อย่างไรก็ตามฉันติดตั้ง php แล้วยืนยันด้วยphp -vและความจริงที่ว่าฉันมี phpfilemanager สำหรับคนที่จะแก้ไขไฟล์ ทำไมมันไม่ใช้ล่าม php
dukevin

คุณต้องรันด้วยphp /var/www/trash/run.phpไม่ใช่แค่ชื่อไฟล์ PHP เอง
slhck

1
ไม่เป็นไร! ฉันไม่แน่ใจเกี่ยวกับข้อมูลเฉพาะเกินไป แต่ควรเป็นเพราะเมื่อคุณเรียกใช้จากบรรทัดคำสั่งคุณจะเรียกใช้ในฐานะผู้ใช้ที่ถูกต้องในขณะที่เมื่อเรียกใช้จากเบราว์เซอร์ผู้ใช้จะหายไป คุณจะต้องตรวจสอบว่าภายในเชลล์สคริปต์ของคุณฉันเดา
slhck

4

คุณจำเป็นต้องมีความฉลาดด้านเซิร์ฟเวอร์สำหรับสิ่งนี้ HTML เพียงอย่างเดียวไม่เพียงพอเนื่องจากเป็นแบบคงที่ วิธีหนึ่งที่ใช้กันทั่วไปคือ PHP ข้อเสนอที่โฮสต์หลายรายการจะมีการติดตั้ง php เป็นค่าเริ่มต้น

คุณสามารถใช้โปรแกรม ftp เพื่อวางไฟล์ข้อความลงในไดเรกทอรีรากของเซิร์ฟเวอร์ของคุณ

ไฟล์ข้อความอาจมีชื่อว่า "run.php" ด้วยเนื้อหาต่อไปนี้:

<h3>Executing /path/to/name.sh</h3>
<?
exec('/path/to/name.sh');
?>

สมมติว่าโดเมนของคุณคือ "example.com" หากคุณไปที่หน้านี้ในเบราว์เซอร์ของคุณ:

http://example.com/run.php

จากนั้นไฟล์ php จะถูกเรียกใช้งานบนเซิร์ฟเวอร์ มันจะส่งหน้า HTML ไปยังเบราว์เซอร์ที่มีส่วนหัว และสคริปต์จะถูกดำเนินการบนเซิร์ฟเวอร์

มีบางสิ่งที่คุณควรคำนึงถึงและการปรับปรุงที่เป็นไปได้:

1) ทุกคนจะสามารถเข้าชมหน้านี้ได้เช่นกัน คุณสามารถรักษาความปลอดภัยหน้าด้วย htacces

2) หน้านี้จะเริ่มทำงานในกรณีที่คำขอ "GET" ปกติจากเบราว์เซอร์ แต่มันจะบุกรุกการกระทำบนเซิร์ฟเวอร์และหากการกระทำนี้ทำการเปลี่ยนแปลงข้อมูลหรือทำสิ่งที่สำคัญมันจะเป็นการดีกว่าที่จะใช้สคริปต์ในคำขอ POST เท่านั้น

3) คุณสามารถแทรกคำสั่งแบบฟอร์ม / ปุ่มเพื่อให้สามารถโหลด / ดำเนินการหน้าอีกครั้ง ต้องแน่ใจว่าใช้วิธีการที่ถูกต้อง (GET หรือ POST) ในแอตทริบิวต์ method ของคำสั่ง form HTML

4) เป็นการดีที่จะได้รับผลลัพธ์ของเชลล์สคริปต์ (โค้ด rturn และอาจส่งข้อความ) และเขียนไปยังเบราว์เซอร์ มีปัญหาเพียงพอสำหรับการแยกต่างหาก:)


3

อาจเป็นปัญหาสิทธิ์

เมื่อคุณทริกเกอร์มันโดยใช้webappเป็นapacheที่เรียกใช้สคริปต์ หากapacheไม่มีสิทธิ์เรียกใช้สคริปต์สคริปต์จะไม่ทำงาน

วิธีแก้ไข: ตรวจสอบสิทธิ์แล้วลองอีกครั้ง .. :)


1

ฉันรู้ว่ามันสายไปแล้ว แต่ฉันคิดว่ามันคุ้มค่าที่จะสังเกตว่าการกำหนดค่า CGI บนเซิร์ฟเวอร์จะช่วยให้คุณเรียกใช้สคริปต์ทุบตีฝั่งเซิร์ฟเวอร์โดยไม่ต้องใช้ PHP หรืออะไรก็ตาม

ฉันรู้ว่านี่ไม่ได้ตอบคำถามที่อัพเดท แต่ฉันพบสิ่งนี้เมื่อพยายามคิดออกเองดังนั้นฉันจึงคิดว่าฉันจะโพสต์มัน!


0

ในการรันเชลล์สคริปต์โดยตรงจากเบราว์เซอร์คุณควรเพิ่มกฎนี้ลงในไฟล์. htaccess ของคุณ:

Options +ExecCGI
AddHandler cgi-script .sh

สิ่งนี้บอกให้เว็บเซิร์ฟเวอร์จัดการไฟล์. sh เป็นสคริปต์ CGI อย่าลืมเปลี่ยนไฟล์. sh เป็น 755

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