Chạy một kịch bản shell với nút html


12

Tôi muốn khởi chạy một tập lệnh bash khi nhấn nút trên trang web. Đây là sự cố gắng đầu tiên của tôi:

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

Nhưng không có may mắn. Bất kỳ đề xuất?

EDIT- Làm theo lời khuyên của slhclk và mit:

Tôi có một tệp php trong / var / www mà tôi trỏ trình duyệt web của mình tới. Nội dung của tập tin như sau:

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

tesh.sh chứa điều này:

screen -S server1 -X quit

Nếu tôi gõ /home/aa/scripts/test.shshell, script có thể thực thi. Tuy nhiên, khi tôi trỏ trình duyệt web của mình tới http://example.com/screen.php (có mã ở trên), tôi thấy một trang trống và tập lệnh đã không được thực thi. Cả hai đều có quyền thực thi. Tại sao nó không hoạt động?


Sẽ rất thú vị khi biết loại máy chủ web này là gì. Ví dụ, nó có thể là một máy chủ linux gia đình, một máy tính windows với XAMPP hoặc một dịch vụ lưu trữ hàng loạt trang web tiêu chuẩn với một tên miền từ một hoster lớn?
mit

Tôi đang sử dụng debian lenny chạy ra một vps tôi thuê
dukevin

1
Đây thực sự là một bản sao của điều này, thậm chí được hỏi bởi cùng một người dùng ">> stackoverflow.com/questions/6235785/ mẹo , nơi tôi đã đăng câu trả lời làm việc của mình. Cảm thấy chúng nên được liên kết.
FreeSoftwareServers

Câu trả lời:


11

Những gì bạn đang cố gắng làm là không thể theo cách đó.

Lưu ý rằng luôn có hai mặt của nó: Phía máy khách và phía máy chủ. Là tập lệnh trên máy khách hay trên máy chủ?


Nếu đó là trên máy khách: Bạn là khách truy cập chỉ nhìn thấy một trang web HTML. onClicksẽ chỉ có thể khởi chạy JavaScript (hoặc các ngôn ngữ kịch bản lệnh khác ) chứ không thể có bất kỳ tập lệnh shell tùy ý nào cư trú trên máy tính của bạn. Các tập lệnh HTML chỉ chạy trong trình duyệt và chỉ có thể thực hiện những điều hạn chế. Quan trọng nhất, họ không thể tương tác với máy tính của bạn.

Hãy nghĩ về nó: Làm thế nào trình duyệt sẽ biết cách mở tệp? Bạn không nghĩ rằng đây cũng sẽ là một vấn đề bảo mật - một trang web đơn giản kích hoạt việc thực thi các tập lệnh trên máy tính của khách hàng? Điều gì nếu có một cái gì đó như thế onClick('rm -rf /home/user')nào?

Một cách khác là chạy một applet Java, nếu bạn muốn mã được thực thi trên máy khách, nhưng điều này không hoàn toàn giống nhau và nó thực sự phức tạp. Tôi không nghĩ cần phải giải thích điều này một cách chi tiết.


Nếu tập lệnh nằm trên máy chủ: Nếu bạn muốn chạy tập lệnh ở phía máy chủ và để người dùng kích hoạt thực thi tập lệnh, thì bạn cần sử dụng ngôn ngữ lập trình phía máy chủ. Chỉ HTML sẽ không làm điều đó, bởi vì nó ít nhiều là một tệp tĩnh. Nếu bạn muốn tương tác với máy chủ, ví dụ bạn có thể sử dụng PHP .

Nó có execchức năng chạy tập lệnh dòng lệnh được lưu trữ trên máy chủ web. Về cơ bản, bạn có thể viết exec('/path/to/name.sh');và nó sẽ chạy tập lệnh trên máy chủ.

Tuy nhiên, chỉ đưa điều này vào onClicklà không đủ ở đây. Nếu bạn chưa biết về lập trình web phía PHP và máy chủ, bạn có thể muốn đọc một vài hướng dẫn trước và sau đó quay lại với một câu hỏi cụ thể hơn.


Nếu bạn có tệp php với exec(...)lệnh thích hợp , hãy đảm bảo tập lệnh đã thực thi các quyền được thiết lập không chỉ cho người dùng mà còn cho nhóm máy chủ web, vì vậy trong trường hợp đơn giản nhất 777.

Trong trường hợp gặp sự cố, hãy kiểm tra giá trị trả về của tập lệnh echo exec(...);để xem có lỗi nào không.

Bạn cũng có thể chạy tập lệnh từ dòng lệnh chứ không phải từ trình duyệt php /path/to/file.php.


Cảm ơn rất nhiều vì câu trả lời thấu đáo. Kịch bản shell nằm trên máy tính của tôi. Tôi đang thử những gì bạn đã viết, tuy nhiên, tôi đang gặp phải một vấn đề. Tôi đã chỉnh sửa câu hỏi của mình ở trên
dukevin

Được rồi, đây là một vấn đề khác nhau. Bạn có thực sự đã cài đặt PHP không? Cố gắng lấy mã trả về của execdòng bằng cách viết echo exec(...);. Cũng lưu ý rằng tập lệnh cần có quyền thực thi cho nhóm máy chủ web của bạn chạy, không chỉ người dùng của bạn.
slhck

vâng tôi có chmod 777 trên cả hai tập tin. Và tôi đã thử chạy php trực tiếp từ shell với kết quả kỳ lạ. pastebin.com/eU0xTkp2 Tuy nhiên, tôi đã cài đặt php, xác nhận php -vvà thực tế là tôi có phpfilemanager để mọi người chỉnh sửa tệp trên đó. Tại sao nó không sử dụng trình thông dịch php?
dukevin

Bạn cần chạy nó với php /var/www/trash/run.phpvà không chỉ tên tệp PHP.
slhck

1
Không một thư gi! Tôi không chắc lắm về các chi tiết cụ thể, nhưng nên bởi vì khi bạn chạy nó từ dòng lệnh, bạn sẽ chạy nó với tư cách là người dùng chính xác, trong khi khi chạy từ trình duyệt, người dùng bị thiếu. Bạn sẽ cần phải kiểm tra xem trong kịch bản shell của bạn, tôi đoán vậy.
slhck

4

Bạn cần một số thông minh phía máy chủ cho việc này. HTML là không đủ, bởi vì nó là tĩnh. Một cách phổ biến sẽ là php. Nhiều ưu đãi được lưu trữ có cài đặt php theo mặc định.

Bạn có thể sử dụng chương trình ftp để đặt tệp văn bản vào thư mục gốc của máy chủ.

Textfile có thể được đặt tên là "run.php" với nội dung sau:

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

Giả sử tên miền của bạn là "example.com", nếu bạn truy cập trang này trong trình duyệt của mình:

http://example.com/run.php

sau đó tệp php sẽ được thực thi trên máy chủ. Nó sẽ gửi một trang HTML đến trình duyệt với tiêu đề. Và kịch bản sẽ được thực thi trên máy chủ.

Có một số điều cần lưu ý và một số cải tiến có thể:

1) mọi người sẽ có thể truy cập trang này, cả robot. Bạn có thể bảo mật trang bằng htacces.

2) Trang này sẽ kích hoạt trong trường hợp yêu cầu "NHẬN" bình thường từ trình duyệt. Nhưng nó tạo ra một hành động trên máy chủ và nếu hành động này thay đổi dữ liệu hoặc làm điều gì đó quan trọng, tốt hơn là chỉ kích hoạt tập lệnh theo yêu cầu POST.

3) Bạn có thể chèn một câu lệnh biểu mẫu / nút để có thể tải lại / thực hiện lại trang. Hãy chắc chắn sử dụng đúng phương thức (GET hoặc POST) trong thuộc tính phương thức của câu lệnh biểu mẫu HTML.

4) Sẽ rất tốt nếu lấy kết quả của tập lệnh shell (mã rturn và có thể xuất văn bản) và ghi nó vào trình duyệt. Điều này có đủ vấn đề cho một quá trình riêng biệt :)


3

Nó có thể là một vấn đề cho phép.

Khi bạn kích hoạt nó bằng cách sử dụng webapp , đó là apache chạy tập lệnh. Nếu apache không có quyền chạy tập lệnh thì nó sẽ không hoạt động.

Giải pháp: kiểm tra sự cho phép và thử lại .. :)


1

Tôi biết điều này đã muộn nhưng tôi nghĩ rằng đáng chú ý rằng việc định cấu hình CGI trên máy chủ sẽ cho phép bạn chạy tập lệnh bash phía máy chủ mà không cần sử dụng PHP hoặc bất cứ thứ gì tương tự.

Tôi biết điều này không giải quyết được câu hỏi cập nhật, nhưng tôi đã tìm thấy điều này khi cố gắng tự mình tìm ra mọi thứ nên tôi nghĩ rằng tôi sẽ đăng nó!


0

Để chạy tập lệnh shell trực tiếp từ trình duyệt, bạn nên thêm quy tắc này vào tệp .htaccess của mình:

Options +ExecCGI
AddHandler cgi-script .sh

Điều này báo cho máy chủ web coi các tệp .sh như các tập lệnh CGI. Đừng quên thay đổi quyền .sh thành 755.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.